FastCGIがPHPスクリプトの実行に使用されているかどうかを確実に知る方法
質問
ホストされたサイトがあり、Joomlaの設定に問題があります(IIS7でJoomla + php + mySQLを実行し、サーバー2008に勝ちます)。ローカルマシン(Joomla + php + IIS7 + vista x64のmySQL)で同様の構成を実行しているため、少なくともこれを設定する方法に関するさまざまなチュートリアルで示された指示に従うことができました。
ホストされたサイトでのこの症状は、JoomlaでSEO設定をオンにできないことです(最初の設定<!> quot; Search Engine Friendly URLs <!> quot;でさえも)。 404(ファイルが見つかりません)またはURLが正しく書き換えられているように見えますが、表示されるのは常にホームページのコンテンツです。自宅のマシンでも同様の問題がありましたが、FastCGIを使用してphpをホストしていなかったことが原因であることが判明したため、ホストサイトで調査することにしました。
とにかく、ホストされたサイトのjoomlaをホストしているディレクトリのweb.configファイルで、次の行に気付きました:
<add name="Plesk_Handler_3522909676" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php5isapi.dll" resourceType="Either" />
過去の経験から、fastCGIで実行していない場合、phpにはいくつかの問題があることがわかっています。ルートフォルダーのweb.configが代わりに次の行を使用していることに気付きました。
<add name="Plesk_Handler_0286090609" path="*.php" verb="*" modules="CgiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php-cgi.exe" resourceType="Either" />
それをjoomlaディレクトリのweb.configにコピーし、別の動作になりました...それでも動作しません。 phpInfo()を実行するjoomlaディレクトリに.phpファイルをロードすると、サーバーAPIではCGI / FastCGIと表示されます。 FastCGIが使用されているという肯定的な確認ですか? Web設定のハンドラーがmodules = <!> quot; CgiModule <!> quot;を指すのはなぜですか。モジュールの代わりに= <!> quot; FastCgiModule <!> quot; (それが存在するかどうかはわかりませんが、CgiModuleの言及が疑わしいだけです。)
これはホストされたサイトなので、私が知る限り、ApplicationHost.configファイルにアクセスできません...
解決
これは簡単なテストです:
- でphpinfo.phpファイルを作成します
<?php phpinfo(); ?>
内部;
-
phpinfoの出力を確認し、_SERVER [<!> quot; REQUEST_URI <!> quot;]を探します。
この変数が欠落している場合、CGIが使用されます。変数が存在し、/ phpinfo.php / foobar?foo = barに正しく設定されている場合、ISAPIまたはFastCGIが使用されます。サーバーAPIの出力の上部付近を見てください。 ISAPI(ISAPIが使用されていることを意味する)またはCGI / FastCGI(既にCGIを除外しているため、FastCGIが使用されていることを意味する)のいずれかに設定する必要があります。
他のヒント
(centosで)apachectl -Mを使用できます。有効になっているモジュールが表示されます。
apachectl -M:
file_cache_module(共有) mem_cache_module(共有) version_module(共有) fastcgi_module(共有)
残念ながら、\_SERVER["REQUEST_URI"]
のチェックは機能しませんでした。 CGI または FastCGI を使用すると、常に/phpinfo.php/foobar?foo=bar
が表示されました。
Server API = CGI/FastCGI
が設定されているかどうかも確認できませんでした。これは、使用されているものではなく、コンパイルされたバージョンのphpがサポートするインターフェイスのみを示します。しかし、より確実に機能する別の方法を見つけました。
テキストを含む phpinfo.php という場所にファイルを配置します:<? php phpinfo(); ?>
変数の確認\_ENV["REDIRECT_HANDLER"]
:
php5-fastcgi
(または他のfastcgi-ish)に設定されている場合、リクエストはおそらく FastCGI を経由しました。 application/x-httpd-php
に設定されている場合(または上記以外の場合)、 CGI を使用しています。
ただし、確実な方法は、小さなテストを実行することです。これにはab
(Apache Bench)ツールが必要です。
CGIの有無にかかわらず、これを別のマシンから実行します。
ab -c 100 -n 1000 http://yourdomain.com/path/phpinfo.php
Time taken for tests:
行を確認します。少なくとも私のボックスでは、1.3Mbps ADSL接続を介してVPSにアクセスすると、FastCGIはそれを完全に使い果たしましたが、CGIでは半分しか満たせませんでした。
これがお役に立てば幸いです。
php_sapi_name()またはPHP_SAPI、両方とも動作します。
http://php.net/manual/en/function .php-sapi-name.php
<?php
if (php_sapi_name() != 'cgi-fcgi'){
echo 'I knew fastcgi wasn\'t working.';
}else{
echo 'Holy crap, something worked for once.';
}
Joomlaは、書き換えルールを含む.htaccessファイルを作成して、検索エンジンに優しいURLを有効にします。 Apacheを使用している場合、<!> quot; AllowOverride FileInfo <!> quot;を設定する必要があります。 joomlaインストールを含むディレクトリ用。 IISを使用している場合、IISModRewriteなどのモジュールが必要です。手順は次のとおりです。[ http://www.micronovae.com/ModRewrite/ articles / SEFJoomla.html]
参照先が表示されるはずです
<?php
phpinfo();
?>
サーバーAPI = CGI / FastCGI
fastcgiが実行されていないときにスクリプトが完全に失敗する場所に最初に設定するようにしてください。そうすれば、動作するときにfastcgiデーモンが原因であることがわかります。
これは私のために働いた。
/**
* return phpinfo() results as an array
*
* @credit http://php.net/manual/en/function.phpinfo.php#106862
* @param void
* @return array
*/
function phpinfo_array(){
ob_start();
phpinfo();
$info_arr = array();
$info_lines = explode("\n", strip_tags(ob_get_clean(), '<tr><td><h2>'));
$cat = 'general';
foreach($info_lines as $line){
preg_match('/<h2>(.*)<\/h2>/', $line, $title) ? $cat = preg_replace('/\s+/', '_', strtolower(trim($title[1]))) : null;
if(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){
$subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1])));
$info_arr[$cat][$subcat] = $val[2];
} elseif(preg_match('/<tr><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><td[^>]+>([^<]*)<\/td><\/tr>/', $line, $val)){
$subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1])));
$info_arr[$cat][$subcat] = array('local' => $val[2], 'master' => $val[3]);
}
}
return $info_arr;
}
// output proper response code
$phpinfo = phpinfo_array();
$configure = (@isset($phpinfo['general']['configure_command'])) ?: null;
// properly account for FastCGI
if ($configure && preg_match('/--enable-fastcgi/', $configure)){
// fastcgi response
header('Status: 403 Access is forbidden');
} else {
// http response
header('HTTP/1.0 403 Access is forbidden');
}