Comment savoir avec certitude si FastCGI est utilisé pour exécuter des scripts php

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai un site hébergé et je ne parviens pas à configurer Joomla (exécuter 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), j'ai donc au moins été capable de suivre les instructions données dans divers tutoriels sur la configuration de cette solution.

Ce problème avec le site hébergé est que je ne peux activer aucun paramètre de référencement dans Joomla (pas même le premier paramètre, & "; URL conviviales pour les moteurs de recherche &";). Je reçois soit 404 (fichier non trouvé) ou l'URL est correctement réécrite, mais c'est toujours le contenu de la page d'accueil qui est affiché. J'avais un problème similaire sur mon ordinateur personnel et c'est parce que je n'utilisais pas FastCGI pour héberger php. J'ai donc décidé d'enquêter sur le site hébergé.

Quoi qu'il en soit, j'ai noté dans le fichier web.config du répertoire hébergeant 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" />

Par expérience, je sais que php a quelques problèmes quand il ne tourne pas sous fastCGI. J'ai remarqué que web.config dans le dossier racine utilisait plutôt la ligne suivante:

<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 l'ai copié dans le fichier web.config du répertoire joomla et j'ai eu un comportement différent ... mais qui ne fonctionne toujours pas. Si je charge un fichier .php dans le répertoire joomla qui exécute phpInfo (), sous API du serveur, il est indiqué CGI / FastCGI. Est-ce une confirmation positive que FastCGI est utilisé? Pourquoi le gestionnaire dans la configuration Web pointe-t-il sur modules = & "; CgiModule &"; au lieu de modules = " FastCgiModule " (Je ne suis même pas sûr que cela existe, mais je trouve que la mention de CgiModule est suspecte).

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

Était-ce utile?

La solution

Voici un test simple:

  1. Créez un fichier phpinfo.php avec

 <?php phpinfo(); ?> 

à l'intérieur;

  1. Demander http://votresite.com/phpinfo.php/foobar? foo = bar

  2. Vérifiez le résultat de phpinfo et recherchez _SERVER [" REQUEST_URI "]].

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

Autres conseils

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

apachectl -M:

module_cache_fichier (partagé) mem_cache_module (partagé) version_module (partagé) fastcgi_module (partagé)

Malheureusement, la vérification \_SERVER["REQUEST_URI"] n'a pas fonctionné pour moi. L’utilisation de CGI ou de FastCGI permet de toujours afficher /phpinfo.php/foobar?foo=bar.

N'a pas non plus vu si Server API = CGI/FastCGI était défini - cela ne vous dit que les interfaces prises en charge par la version compilée de php, pas ce qui est utilisé. Cependant, j'ai trouvé une autre méthode qui pourrait fonctionner de manière plus fiable.

Plonquez à la place un fichier appelé phpinfo.php contenant le texte: <? php phpinfo(); ?>

Recherchez la variable \_ENV["REDIRECT_HANDLER"]:
Si cette option est définie sur php5-fastcgi (ou quelque chose d'autre fastcgi-ish), la demande a probablement été traitée par FastCGI . Si ce paramètre est défini sur application/x-httpd-php (ou si je suppose quelque chose d’autre que ce qui précède), vous utilisez CGI .

Cependant, un moyen infaillible consiste à effectuer un petit test. Vous avez besoin de l'outil ab (Apache Bench) pour cela.
Avec et sans CGI, exécutez cette opération à partir d'une autre machine:

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

Vérifiez la ligne Time taken for tests:. Au moins sur mon ordinateur, en accédant à mon VPS avec une connexion ADSL à 1,3 Mbps, FastCGI l’a complètement dépassé, alors qu’avec CGI, il n’a pu en remplir que la moitié.

J'espère que cela vous aidera.

php_sapi_name () ou PHP_SAPI, les deux fonctionnent.

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 crée un fichier .htaccess contenant 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 joomla. Si vous utilisez IIS, vous aurez besoin d'un module tel que IISModRewrite. Voici les instructions pour cela: articles / SEFJoomla.html]

Vous devriez y voir une référence

<?php
phpinfo();
?>

API du serveur = CGI / FastCGI

Assurez-vous que les choses sont initialement configurées de manière à ce que le script échoue complètement lorsque fastcgi n'est pas en cours d'exécution. Alors vous saurez, quand cela fonctionnera, que le démon fastcgi en est la raison.

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');
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top