2009-03-04 6 views
13

ho un sito ospitato e sto avendo problemi a configurare Joomla (in esecuzione Joomla + PHP + MySQL su IIS7 + Windows Server 2008). Ho una configurazione simile in esecuzione su una macchina locale (Joomla + php + mySQL su IIS7 + vista x64), quindi sono stato almeno in grado di seguire le istruzioni mostrate in vari tutorial su come impostarlo.Come sapere con certezza se FastCGI viene utilizzato per eseguire script php

Questo sintomo con il sito in hosting è che non posso accendere le impostazioni SEO in Joomla (nemmeno la prima impostazione, "Search Engine Friendly URL"). Ottengo 404 (file non trovato) o l'URL appare riscritto correttamente ma è sempre il contenuto della pagina iniziale che viene visualizzato. Ho avuto un problema simile sulla mia macchina di casa e si è scoperto che non stavo usando FastCGI per ospitare PHP, quindi ho deciso di indagare sul sito ospitato.

In ogni caso, ho notato nel file web.config della directory di hosting joomla sul sito ospitato la seguente riga:

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

Dalle esperienze passate, so che PHP ha alcuni problemi quando non è in esecuzione in FastCGI . Ho notato che il web.config nella cartella principale utilizzata la seguente riga invece:

<add name="Plesk_Handler_0286090609" path="*.php" verb="*" modules="CgiModule" scriptProcessor="c:\program files (x86)\parallels\plesk\additional\pleskphp5\php-cgi.exe" resourceType="Either" /> 

ho copiato che nel web.config nella directory di joomla, e ha un comportamento diverso ... ma ancora non funziona. Se carico un file .php nella directory di joomla che esegue phpInfo(), sotto Server API si dice CGI/FastCGI. È la conferma positiva che FastCGI viene utilizzato? Perché il gestore nel web punto di configurazione per i moduli = "CgiModule" invece di moduli = "FastCgiModule" (io non sono nemmeno sicuro che esista, ma ho appena trovato la menzione di CgiModule sospette).

E 'un sito ospitato, in modo per quanto ne so io non ho accesso ai file ApplicationHost.config ...

risposta

24

Ecco un semplice test:

  1. Creare un file phpinfo.php con

<?php phpinfo(); ?> 

all'interno;

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

  2. Controllare l'output di phpinfo e potete trovare _SERVER [ "REQUEST_URI"].

Se questa variabile non è presente, viene utilizzato CGI.Se la variabile è presente e impostata correttamente su /phpinfo.php/foobar?foo=bar, viene utilizzato ISAPI o FastCGI. Guarda vicino alla parte superiore dell'output per Server API; dovrebbe essere impostato su ISAPI (che significa che ISAPI viene utilizzato) o CGI/FastCGI (che significa che FastCGI viene utilizzato, poiché abbiamo già escluso CGI).

+1

$ _SERVER ['REQUEST_URI'] può essere visualizzato correttamente sia in CGI che in FastCGI e l'API del server può mostrare 'CGI/FastCGI' per CGI e FastCGI. Una differenza è che in FastCGI $ _SERVER ["REDIRECT_HANDLER"] potrebbe mostrare php-fastcgi, ma anche questo non conferma che "FastCGI" sia utilizzato poiché "php-fastcgi" è solo un nome di variabile usato nel file di configurazione . –

+0

@Jimmy, questa risposta è molto [bisogno di citazioni] (http://xkcd.com/285). Inoltre, il metodo che descrivi sembra un po '* hacky *, c'è un modo migliore e più robusto per determinare direttamente le impostazioni? – Pacerier

+0

@Pacerier Ha funzionato per me e apparentemente per molte altre persone. Non sono riuscito a trovare un modo migliore, ma sentiti libero di pubblicare una risposta "migliore e più solida" se ne hai una. L'ho inventato io stesso, quindi nessuna citazione. – Jimmy

0

Si dovrebbe vedere un fatto riferimento ad esso da

<?php 
phpinfo(); 
?> 

API Server = CGI/FastCGI

+0

Ma è che di sicuro? Il mio ospite dice che non supportano FastCGI; il web.config sopra dice che stanno usando CGI, non FastCGI; e ancora, vedo ancora Server API = CGI/FastCGI in phpinfo() – Jimmy

0

Joomla crea un file .htaccess con regole di riscrittura in esso per attivare motori di ricerca URL amichevole. Se stai usando Apache dovrai impostare "AllowOverride FileInfo" per la directory che contiene l'installazione di joomla. Se stai usando IIS avrai bisogno di un modulo come IISModRewrite. Ecco le istruzioni per questo: [http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

2

Sfortunatamente, il controllo \_SERVER["REQUEST_URI"] non ha funzionato per me. Utilizzando CGI o FastCGI, viene sempre visualizzato /phpinfo.php/foobar?foo=bar.

Né ha visto se è stato impostato Server API = CGI/FastCGI - che indica solo quali interfacce supporta la versione compilata di php, non ciò che viene utilizzato. Tuttavia, ho trovato un altro metodo che può funzionare in modo più affidabile.

Plonk un file in luogo chiamato phpinfo.php contenente il testo: <? php phpinfo(); ?>

Controllare la variabile \_ENV["REDIRECT_HANDLER"]:
Se è impostato su php5-fastcgi (o qualcos'altro FastCGI-ish) la richiesta più probabilmente passò attraverso FastCGI. Se è impostato su application/x-httpd-php (o presumo qualcosa di diverso da quello sopra), si utilizza CGI.

Tuttavia, un modo sicuro è eseguendo un piccolo test. Per questo è necessario lo strumento ab (Banco Apache).
con e senza CGI, eseguire questo da un'altra macchina:

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

controllare la linea Time taken for tests:. Almeno sulla mia scatola, accedendo al mio VPS su una connessione ADSL a 1,3 Mbps, FastCGI lo ha completamente superato, mentre con CGI era in grado di riempirne solo la metà.

Spero che questo aiuti.

0

Assicurarsi che le impostazioni siano inizialmente impostate su dove lo script non riesce completamente quando fastcgi non è in esecuzione. Allora saprai, quando funziona, che il demone fastcgi è la ragione.

0

Questo ha funzionato per me.

/** 
* 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'); 
} 
+1

Come funziona lo script e come funziona lo script? – Pacerier

3

È possibile utilizzare (su CentOS) apachectl -M, potrai mostrare ciò che i moduli sono abilitati:

apachectl -M:

file_cache_module (comune) mem_cache_module (comune) version_module (condiviso) fastcgi_module (condiviso)

+0

Funziona anche su Ubuntu, anche se dovevo usare sudo – Sam

1

php_sapi_name() o PHP_SAPI, entrambi funzionano.

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.'; 
    } 
+0

Non è stato scappato, per favore modifica il codice. – Adrian