Как точно знать, будет ли FastCGI использоваться для запуска скриптов php

У меня есть размещенный сайт, и у меня возникли проблемы с настройкой 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 …

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

  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. Посмотрите на верхнюю часть вывода для Server API; он должен быть установлен либо в ISAPI (что означает, что используется ISAPI), либо CGI / FastCGI (что означает, что FastCGI используется, поскольку мы уже исключили CGI).

Вы можете использовать (на 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, а не то, что используется. Однако я нашел другой метод, который может работать более надежно.

Plonk файл на месте phpinfo.php, содержащий текст: <? php phpinfo(); ?> <? 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 смог заполнить только половину.

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

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 с правилами перезаписи в нем, чтобы включить дружественные поисковые системы. Если вы используете Apache, вам нужно будет установить «AllowOverride FileInfo» для каталога, содержащего вашу установку joomla. Если вы используете IIS, вам понадобится модуль, такой как IISModRewrite. Вот инструкции для этого: [ http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html%5D

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

 <?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'); }