Cómo saber con certeza si FastCGI se está utilizando para ejecutar scripts php

Tengo un sitio alojado y tengo problemas para configurar Joomla (ejecutando Joomla + php + mySQL en IIS7 + win server 2008). Tengo una configuración similar ejecutándose en una máquina local (Joomla + php + mySQL en IIS7 + vista x64), así que al menos pude seguir las instrucciones que se muestran en varios tutoriales sobre cómo configurar esto.

Este síntoma con el sitio alojado es que no puedo activar ninguna configuración de SEO en Joomla (ni siquiera la primera configuración, “URLs amigables para el motor de búsqueda”). Recibo 404 (archivo no encontrado) o la URL aparece correctamente reescrita, pero siempre se muestra el contenido de la página de inicio. Tuve un problema similar en mi máquina doméstica y resultó ser porque no estaba usando FastCGI para alojar php, así que decidí investigar eso en el sitio alojado.

De todos modos, noté en el archivo web.config del directorio que aloja a joomla en el sitio alojado la siguiente línea:

 

De la experiencia pasada, sé que php tiene algunos problemas cuando no se ejecuta en fastCGI. Noté que web.config en la carpeta raíz usaba la siguiente línea:

  

Copié eso en web.config en el directorio joomla, y obtuve un comportamiento diferente … pero aún no funcionaba. Si cargo un archivo .php en el directorio joomla que ejecuta phpInfo (), en Server API dice CGI / FastCGI. ¿Es esa una confirmación positiva de que se está utilizando FastCGI? ¿Por qué el controlador en la configuración web apunta a modules = “CgiModule” en lugar de modules = “FastCgiModule” (ni siquiera estoy seguro de que exista, pero me parece sospechosa la mención de CgiModule).

Es un sitio alojado, por lo que yo sé, no tengo acceso al archivo ApplicationHost.config …

Aquí hay una prueba simple:

  1. Crea un archivo phpinfo.php con
   

dentro;

  1. Solicitud http://yoursite.com/phpinfo.php/foobar?foo=bar

  2. Compruebe la salida de phpinfo y busque _SERVER [“REQUEST_URI”].

Si esta variable falta, entonces se usa CGI. Si la variable está presente y configurada correctamente en /phpinfo.php/foobar?foo=bar, entonces se usa ISAPI o FastCGI. Mire cerca de la parte superior de la salida para Server API; debe establecerse en ISAPI (lo que significa que se está utilizando ISAPI) o CGI / FastCGI (lo que significa que se está utilizando FastCGI, ya que ya descartamos CGI).

Puede usar (en centos) apachectl -M, mostrará qué módulos están habilitados:

apachectl -M:

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

Desafortunadamente, la comprobación \_SERVER["REQUEST_URI"] no funcionó para mí. Al usar CGI o FastCGI , siempre mostraba /phpinfo.php/foobar?foo=bar .

Tampoco lo hizo ver si se configuró Server API = CGI/FastCGI , eso solo le indica qué interfaces admite la versión comstackda de php, no qué se está utilizando. Sin embargo, encontré otro método que puede funcionar de manera más confiable.

Plonk un archivo en su lugar llamado phpinfo.php que contiene el texto:

Compruebe la variable \_ENV["REDIRECT_HANDLER"] :
Si está configurado en php5-fastcgi (o algo más fastcgi-ish), la solicitud probablemente se haya procesado a través de FastCGI . Si está configurado en application/x-httpd-php (o supongo que es diferente de lo anterior), está utilizando CGI .

Sin embargo, una forma segura es realizar una pequeña prueba. Necesitas la herramienta ab (Apache Bench) para esto.
Con y sin CGI, ejecute esto desde otra máquina:

 ab -c 100 -n 1000 http://yourdomain.com/path/phpinfo.php 

Verifique la línea Time taken for tests: Al menos en mi caja, al acceder a mi VPS a través de una conexión ADSL de 1.3 Mbps, FastCGI la aprovechó al máximo, mientras que con CGI solo pude completar la mitad.

Espero que esto ayude.

php_sapi_name () o PHP_SAPI, ambos funcionan.

http://php.net/manual/en/function.php-sapi-name.php

  

Joomla crea un archivo .htaccess con reglas de reescritura para habilitar las URL amigables para los motores de búsqueda. Si está utilizando Apache, tendrá que configurar “AllowOverride FileInfo” para el directorio que contiene la instalación de Joomla. Si está utilizando IIS, necesitará un módulo como IISModRewrite. Aquí hay instrucciones para esto: [ http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html%5D

Debería ver una referencia a ella de

  

Servidor API = CGI / FastCGI

Asegúrese de que las cosas estén configuradas inicialmente donde el script falla completamente cuando fastcgi no se está ejecutando. Entonces sabrá, cuando funcione, que fastcgi daemon es la razón.

Esto funcionó para mí.

 /** * 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(), '

')); $cat = 'general'; foreach($info_lines as $line){ preg_match('/

(.*)<\/h2>/', $line, $title) ? $cat = preg_replace('/\s+/', '_', strtolower(trim($title[1]))) : null; if(preg_match('/]+>([^<]*)<\/td>]+>([^<]*)<\/td><\/tr>/', $line, $val)){ $subcat = preg_replace('/\s+/', '_', strtolower(trim($val[1]))); $info_arr[$cat][$subcat] = $val[2]; } elseif(preg_match('/]+>([^<]*)<\/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'); }