2009-03-04 6 views
13

J'ai un site hébergé et j'ai des difficultés à configurer Joomla (exécutant Joomla + php + mySQL sur IIS7 + win server 2008). J'ai une configuration similaire fonctionnant sur une machine locale (Joomla + php + mySQL sur IIS7 + vista x64), donc j'étais au moins capable de suivre les instructions montrées dans divers didacticiels sur la façon de configurer cela.Comment savoir avec certitude si FastCGI est utilisé pour exécuter des scripts php?

Ce problème avec le site hébergé est que je ne peux pas activer les paramètres de référencement dans Joomla (pas même le premier paramètre, "URL de moteur de recherche"). Je reçois soit 404 (fichier non trouvé) ou l'URL apparaît correctement réécrite mais c'est toujours le contenu de la page d'accueil qui est affiché. J'ai eu un problème similaire sur ma machine à la maison et il s'est avéré que c'était parce que je n'utilisais pas FastCGI pour héberger php, alors j'ai décidé d'enquêter sur le site hébergé.

Quoi qu'il en soit, j'ai remarqué dans le fichier web.config du répertoire d'hébergement joomla sur le site hébergé la ligne suivante:

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

De l'expérience passée, je sais que php a des problèmes lorsqu'ils ne sont pas en cours d'exécution FastCGI . J'ai remarqué le web.config dans le dossier racine utilisé la ligne suivante à la place:

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

Je copié que dans le web.config dans le répertoire joomla, et a un comportement différent ... mais ne fonctionne toujours pas. Si je charge un fichier .php dans le répertoire joomla qui exécute phpInfo(), sous Server API, il est indiqué CGI/FastCGI. Est-ce confirmation positive que FastCGI est utilisé? Pourquoi le gestionnaire de la configuration Web pointe-t-il vers modules = "CgiModule" au lieu de modules = "FastCgiModule" (je ne suis même pas sûr que cela existe, mais je trouve juste la mention de CgiModule suspect).

C'est un site hébergé, donc autant que je sais que je n'ai pas accès au fichier ApplicationHost.config ...

Répondre

24

Voici un test simple:

  1. Créer un fichier phpinfo.php avec

<?php phpinfo(); ?> 

à l'intérieur;

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

  2. Vérifiez la sortie de phpinfo et chercher _SERVER [ "REQUEST_URI"].

Si cette variable est manquante, alors CGI est utilisé.Si la variable est présente et correctement définie dans /phpinfo.php/foobar?foo=bar, ISAPI ou FastCGI est utilisé. Regardez près du haut de la sortie de l'API serveur; il doit être défini sur ISAPI (ce qui signifie que ISAPI est utilisé) ou CGI/FastCGI (ce qui signifie que FastCGI est utilisé, car nous avons déjà exclu CGI).

+1

$ _SERVER ['REQUEST_URI'] peut s'afficher correctement dans CGI et FastCGI et l'API Server peut afficher 'CGI/FastCGI' pour CGI et FastCGI.Une différence est que dans FastCGI $ _SERVER ["REDIRECT_HANDLER"] peut afficher php-fastcgi, mais cela ne confirme pas non plus que "FastCGI" est utilisé car "php-fastcgi" est simplement un nom de variable utilisé dans le fichier de configuration . –

+0

@Jimmy, Cette réponse est très [besoin de citations] (http://xkcd.com/285). En outre, la méthode que vous décrivez semble un peu * hacky *, existe-t-il un moyen plus efficace et plus robuste de déterminer les paramètres directement? – Pacerier

+0

@Pacerier Cela a fonctionné pour moi, et apparemment pour beaucoup d'autres personnes. Je ne pourrais pas trouver un meilleur moyen, mais n'hésitez pas à poster une réponse "meilleure et plus robuste" si vous en avez une. Je suis venu avec moi-même, d'où aucune citation. – Jimmy

0

Vous devriez voir un à lui de fait allusion à

<?php 
phpinfo(); 
?> 

API Server = CGI/FastCGI

+0

Mais est-ce bien sûr? Mon hôte dit qu'ils ne supportent pas FastCGI; le web.config ci-dessus indique qu'ils utilisent CGI, pas FastCGI; et pourtant, je vois encore API Server = CGI/FastCGI dans phpinfo() – Jimmy

0

Joomla crée un fichier .htaccess avec des règles de réécriture afin d'activer les URL conviviales pour les moteurs de recherche. Si vous utilisez Apache, vous devrez définir "AllowOverride FileInfo" pour le répertoire contenant votre installation de joomla. Si vous utilisez IIS, vous aurez besoin d'un module tel que IISModRewrite. Voici les instructions pour cela: [http://www.micronovae.com/ModRewrite/articles/SEFJoomla.html]

2

Malheureusement, la vérification \_SERVER["REQUEST_URI"] n'a pas fonctionné pour moi. En utilisant CGI ou FastCGI, il a toujours affiché /phpinfo.php/foobar?foo=bar.

Vous n'avez pas vu si Server API = CGI/FastCGI a été défini - cela vous indique uniquement les interfaces prises en charge par la version compilée de php, et non ce qui est utilisé. Cependant, j'ai trouvé une autre méthode qui peut fonctionner de manière plus fiable.

Plonk un fichier en place appelé phpinfo.php contenant le texte: <? php phpinfo(); ?>

Vérifiez la variable \_ENV["REDIRECT_HANDLER"]:
S'il est réglé sur php5-fastcgi (ou quelque chose d'autre fastcgi-ish) la demande très probablement a traversé FastCGI. Si elle est définie sur application/x-httpd-php (ou si je suppose autre chose que ce qui précède), vous utilisez CGI.

Cependant, un moyen infaillible est d'exécuter un petit test. Vous avez besoin de l'outil ab (Banc Apache) pour cela.
avec et sans CGI, exécutez une autre machine:

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

Vérifiez la ligne Time taken for tests:. Sur ma boîte au moins, en accédant à mon VPS via une connexion ADSL 1.3Mbps, FastCGI l'a complètement optimisé, alors qu'avec CGI, seule la moitié était disponible.

Espérons que cela aide.

0

Assurez-vous que les éléments sont initialement configurés là où le script échoue complètement lorsque fastcgi n'est pas en cours d'exécution. Alors vous saurez, quand cela fonctionne, que le démon fastcgi est la raison.

0

Cela a fonctionné pour moi.

/** 
* 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

Comment fonctionne le script et que fait le script? – Pacerier

3

Vous pouvez utiliser (sur CentOS) apachectl -M, vous montrer quels modules sont activés:

apachectl -M:

file_cache_module (partagé) mem_cache_module (partagé) version_module (partagé) fastcgi_module (partagé)

+0

Fonctionne sur Ubuntu aussi, bien que je devais utiliser sudo – Sam

1

php_sapi_name() ou PHP_SAPI, travaillent tous les deux.

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

N'a pas été échappé, s'il vous plaît modifier le code. – Adrian

Questions connexes