Как точно знать, будет ли 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(); ?>
внутри
-
Запрос http://yoursite.com/phpinfo.php/foobar?foo=bar
-
Проверьте вывод phpinfo и найдите _SERVER [ "REQUEST_URI" ].
Если эта переменная отсутствует, используется CGI. Если переменная присутствует и правильно установлена в/phpinfo.php/foobar?foo=bar, то используется либо ISAPI, либо FastCGI. Посмотрите на верхнюю часть вывода для Server API; он должен быть установлен либо в ISAPI (что означает, что ISAPI используется), либо CGI/FastCGI (что означает, что используется FastCGI, поскольку мы уже исключили CGI).
Ответ 2
Вы можете использовать (на centos) apachectl -M, вы покажете, какие модули включены:
apachectl -M:
file_cache_module (общий)
mem_cache_module (общий)
version_module (общий)
fastcgi_module (общий)
Ответ 3
К сожалению, проверка \_SERVER["REQUEST_URI"]
не работала для меня. Используя CGI или FastCGI, он всегда отображал /phpinfo.php/foobar?foo=bar
.
Также не было видно, было ли установлено Server API = CGI/FastCGI
- это только говорит вам, какие интерфейсы поддерживает скомпилированная версия php, а не то, что используется. Однако я нашел другой метод, который может работать более надежно.
Plonk файл на месте называется 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 смог заполнить только половину.
Надеюсь, что это поможет.
Ответ 4
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.';
}
Ответ 5
Вы должны увидеть ссылку на него из
<?php
phpinfo();
?>
Сервер API = CGI/FastCGI
Ответ 6
Joomla создает файл .htaccess с правилами перезаписи в нем, чтобы включить дружественные поисковые системы. Если вы используете Apache, вам нужно будет установить "AllowOverride FileInfo" для каталога, содержащего вашу установку joomla. Если вы используете IIS, вам понадобится модуль, такой как IISModRewrite. Вот инструкции для этого: [http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]
Ответ 7
Удостоверьтесь, что сначала были установлены настройки, где script завершается сбой, когда fastcgi не запущен. Тогда вы узнаете, когда это работает, этот демон fastcgi является причиной.
Ответ 8
Это сработало для меня.
/**
* 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');
}