Как точно знать, используется ли FastCGI для запуска php-скриптов - PullRequest
16 голосов
/ 04 марта 2009

У меня есть размещенный сайт, и у меня возникают проблемы при настройке Joomla (работает Joomla + php + mySQL на IIS7 + win server 2008). У меня есть аналогичная конфигурация, работающая на локальном компьютере (Joomla + php + mySQL на IIS7 + Vista x64), поэтому я, по крайней мере, смог следовать инструкциям, приведенным в различных руководствах по настройке этого.

Этот признак хост-сайта заключается в том, что я не могу включить какие-либо настройки SEO в Joomla (даже не первую настройку «URL-адреса, дружественные поисковой системе»). Я получаю либо 404 (файл не найден), либо URL-адрес выглядит правильно переписанным, но всегда отображается содержимое домашней страницы. У меня была похожая проблема на моей домашней машине, и, как оказалось, это произошло потому, что я не использовал FastCGI для размещения php, поэтому я решил исследовать ее на размещенном сайте.

В любом случае, я заметил в файле web.config каталога, в котором размещен joomla на размещенном сайте, следующую строку:

<add name="Plesk_Handler_3522909676" path="*.php" verb="*" modules="IsapiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php5isapi.dll" resourceType="Either" />

Из прошлого опыта я знаю, что php имеет некоторые проблемы, когда не работает под fastCGI. Я заметил, что 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" /> 

Я скопировал это в файл web.config в каталоге joomla и получил другое поведение ... но все равно не работает. Если я загружаю файл .php в каталог joomla, который запускает phpInfo (), в разделе Server API он говорит CGI / FastCGI. Это положительное подтверждение , что FastCGI используется? Почему обработчик в веб-конфигурации указывает на модули = "CgiModule" вместо модулей = "FastCgiModule" (я даже не уверен, что он существует, но я просто нахожу упоминание о CgiModule подозрительным).

Это размещенный сайт, насколько я знаю, у меня нет доступа к файлу ApplicationHost.config ...

Ответы [ 8 ]

27 голосов
/ 17 марта 2009

Вот простой тест:

  1. Создайте файл phpinfo.php с

 <?php phpinfo(); ?> 

внутри; * +1010 *

  1. Запрос http://yoursite.com/phpinfo.php/foobar?foo=bar

  2. Проверьте вывод phpinfo и найдите _SERVER ["REQUEST_URI"].

Если эта переменная отсутствует, то используется CGI. Если переменная присутствует и правильно установлена ​​на /phpinfo.php/foobar?foo=bar, то используется либо ISAPI, либо FastCGI. Посмотрите в верхней части вывода для Server API; для него следует установить либо ISAPI (что означает использование ISAPI), либо CGI / FastCGI (что означает использование FastCGI, поскольку мы уже исключили CGI).

4 голосов
/ 30 января 2014

Вы можете использовать (на centos) apachectl -M, вы увидите, какие модули включены:

apachectl -M:

file_cache_module (общий доступ) mem_cache_module (общий доступ) version_module (общий доступ) fastcgi_module (общий доступ)

2 голосов
/ 01 апреля 2016

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 голосов
/ 25 июля 2009

К сожалению, проверка \_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:. На моем компьютере, по крайней мере, при доступе к моему VPS через ADSL-соединение со скоростью 1,3 Мбит / с FastCGI полностью увеличил его, а с помощью CGI смог заполнить только половину.

Надеюсь, это поможет.

0 голосов
/ 27 сентября 2012

Это сработало для меня.

/**
 * 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 голосов
/ 02 августа 2010

Убедитесь, что изначально все настроено так, чтобы скрипт полностью не работал, когда fastcgi не работает. Тогда вы узнаете, когда он работает, причина в том, что демон fastcgi.

0 голосов
/ 06 марта 2009

Joomla создает файл .htaccess с правилами перезаписи, чтобы включить удобные для поисковых систем URL-адреса. Если вы используете Apache, вам нужно будет установить «AllowOverride FileInfo» для каталога, содержащего вашу установку joomla. Если вы используете IIS, вам понадобится такой модуль, как IISModRewrite. Вот инструкции для этого: [http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

0 голосов
/ 04 марта 2009

Вы должны увидеть ссылку на него из

<?php
phpinfo();
?>

Серверный API = CGI / FastCGI

...