web-dev-qa-db-ja.com

FastCGIがphpスクリプトの実行に使用されているかどうかを確実に知る方法

ホストされているサイトがあり、Joomlaの構成に問題があります(IIS7 + win server2008でJoomla + php + mySQLを実行しています)。ローカルマシン(IIS7 + Vistax64上のJoomla + php + mySQL)で同様の構成を実行しているので、少なくとも、これを設定する方法についてさまざまなチュートリアルに示されている手順に従うことができました。

ホストされているサイトでのこの症状は、JoomlaでSEO設定をオンにできないことです(最初の設定である「検索エンジンに適したURL」でさえも)。 404(ファイルが見つかりません)を取得するか、URLが正しく書き換えられたように見えますが、表示されるのは常にホームページのコンテンツです。自宅のマシンでも同様の問題が発生しましたが、PHPをホストするためにFastCGIを使用していなかったことが原因であることが判明したため、ホストされたサイトで調査することにしました。

とにかく、私はホストされたサイトの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 = "FastCgiModule"ではなくmodules = "CgiModule"を指すのはなぜですか(それが存在するかどうかはわかりませんが、CgiModuleについての言及が疑わしいと思います)。

これはホストされたサイトです。私が知る限り、ApplicationHost.configファイルにアクセスできません...

16
Jimmy

簡単なテストは次のとおりです。

  1. でphpinfo.phpファイルを作成します
 <?php phpinfo(); ?> 

内部;

  1. リクエスト http://yoursite.com/phpinfo.php/foobar?foo=bar

  2. Phpinfoの出力を確認し、_SERVER ["REQUEST_URI"]を探します。

この変数が欠落している場合は、CGIが使用されます。変数が存在し、/ phpinfo.php/foobar?foo = barに正しく設定されている場合は、ISAPIまたはFastCGIのいずれかが使用されます。サーバーAPIの出力の上部近くを見てください。 ISAPI(ISAPIが使用されていることを意味します)またはCGI/FastCGI(すでにCGIを除外しているため、FastCGIが使用されていることを意味します)のいずれかに設定する必要があります。

27
Jimmy

(centosで)apachectl -Mを使用すると、有効になっているモジュールが表示されます。

apachectl -M:

file_cache_module(共有)mem_cache_module(共有)version_module(共有)fastcgi_module(共有)

4
damarsan

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.';
    }
2

残念ながら、_\_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では半分しか満たすことができませんでした。

お役に立てれば。

2
Asfand Qazi

これは私のために働いた。

/**
 * 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');
}
0
tobius

あなたはそれへの参照を見るはずです

<?php
phpinfo();
?>

サーバーAPI = CGI/FastCGI

0
Hawk Kroeger

Fastcgiが実行されていないときにスクリプトが完全に失敗する場所に、最初に設定されていることを確認してください。そうすれば、それが機能するとき、fastcgiデーモンが理由であることがわかります。

0
cameron