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

StackOverflow https://stackoverflow.com/questions/609044

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Другие советы

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

апачектл -М:

file_cache_module (shared) mem_cache_module (shared) version_module (shared) fastcgi_module (shared)

К сожалению, проверка \_SERVER["REQUEST_URI"] у меня не сработало.С использованием компьютерная графика или FastCGI, оно всегда отображалось /phpinfo.php/foobar?foo=bar.

И не увидел, если Server API = CGI/FastCGI был установлен - это говорит вам только о том, какие интерфейсы поддерживает скомпилированная версия php, а не о том, что используется.Однако я нашел другой метод, который может работать более надежно.

Поместите файл на место с именем phpinfo.php содержащий текст: <? php phpinfo(); ?>

Проверьте переменную \_ENV["REDIRECT_HANDLER"]:
Если он установлен на php5-fastcgi (или что-то еще в стиле fastcgi) запрос, скорее всего, прошел FastCGI.Если он установлен на application/x-httpd-php (или я предполагаю что-то иное, чем указано выше), вы используете компьютерная графика.

Однако верный способ — провести небольшой тест.Вам нужно 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 с правилами перезаписи, чтобы включить дружественные поисковым системам URL-адреса.Если вы используете Apache, вам нужно будет установить «AllowOverride FileInfo» для каталога, в котором находится ваша установка 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');
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top