Yacs with FastCGI and Suexec ( debian ) [Solved]
Yacs with FastCGI and Suexec
Solution has been fully integratedSolution Manager: Bernard
Issue description
Bonjour ;
Je viens de passer de simple CGI/suPHP à FastCGI/Suexec et je rencontre un problème d'entêtes avec Yacs.
En effet, losque je charge la page la première fois, pas de problèmes. Par contre lorsque j'effectue un rechargement ou encore que je tente de charger une autre page du site j'ai le droit une belle erreur 500 ( Internal Error ).
Ce problème apparaît avec PHP4 comme avec PHP5.
Après un petit tail, voici le genre de chose que j'obiens :
Je présise que bissarement, lorsque je vide le cache du browser, la page se charge à nouveau.
Ayant effectué une recherche sur google, je suis "tombé" sur un post évoquant ce genre de problèmes avec wordpress dont voici le lien http://wordpress.org/support/topic/67416
Par ailleurs, dans cette discussion http://bugs.php.net/bug.php?id=36705 ils parlent plus précisément du problème.
D'après ce que j'ai compris, il faut modifier l'entête selon qu'il s'agit de php exécuté en tant que cgi (fastcgi) comme dans cet exemple :
Le problème, c'est que Bernard a particulièrement abusé (
) en ce qui concerne l'utilisation de la fonction header() et du coup, comme y'en a un peu partout, je sais pas vraiment quoi modifier exactement.
Si Bernard pouvait m'aider à résoudre ce problème, merci.
Ps : A noter que je ne rencontre pas de problème avec mes autre applications (web).
Edit :
Après une petite analyse du code Yacs, il semble que tous les appels à la fonction header() passent par la librairie safe.php. Maintenant, reste à savoir quoi modifier et comment.
A priori, l'entête qui me pose problème est celui-ci (y'en a peut être d'autres...) :
Je vais effectuer des testes mais si tu as déjà la solution Bernard, n'hésite pas.
Je viens de passer de simple CGI/suPHP à FastCGI/Suexec et je rencontre un problème d'entêtes avec Yacs.
En effet, losque je charge la page la première fois, pas de problèmes. Par contre lorsque j'effectue un rechargement ou encore que je tente de charger une autre page du site j'ai le droit une belle erreur 500 ( Internal Error ).
Ce problème apparaît avec PHP4 comme avec PHP5.
Après un petit tail, voici le genre de chose que j'obiens :
ns1:/var/log/apache2# tail error.log
[Wed Mar 05 10:30:21 2008] [error] [client 89.3.162.8] FastCGI: comm with server "/var/www/php-fcgi/primary/php4-fcgi-starter" aborted: error parsing headers: duplicate header 'Status'
[Wed Mar 05 10:30:14 2008] [error] [client 194.250.235.224] FastCGI: comm with server "/var/www/php-fcgi/primary/php4-fcgi-starter" aborted: error parsing headers: duplicate header 'Status', referer: http://www.nuxwin.com/article-38-debian-tutorial-configuration-dns-bind-9
...
Je présise que bissarement, lorsque je vide le cache du browser, la page se charge à nouveau.
Ayant effectué une recherche sur google, je suis "tombé" sur un post évoquant ce genre de problèmes avec wordpress dont voici le lien http://wordpress.org/support/topic/67416
Par ailleurs, dans cette discussion http://bugs.php.net/bug.php?id=36705 ils parlent plus précisément du problème.
D'après ce que j'ai compris, il faut modifier l'entête selon qu'il s'agit de php exécuté en tant que cgi (fastcgi) comme dans cet exemple :
if (substr(php_sapi_name(), 0, 3) == 'cgi')
header("Status: $status");
else
header("HTTP/1.1 $status");
Le problème, c'est que Bernard a particulièrement abusé (
) en ce qui concerne l'utilisation de la fonction header() et du coup, comme y'en a un peu partout, je sais pas vraiment quoi modifier exactement.Si Bernard pouvait m'aider à résoudre ce problème, merci.
Ps : A noter que je ne rencontre pas de problème avec mes autre applications (web).
Edit :
Après une petite analyse du code Yacs, il semble que tous les appels à la fonction header() passent par la librairie safe.php. Maintenant, reste à savoir quoi modifier et comment.
A priori, l'entête qui me pose problème est celui-ci (y'en a peut être d'autres...) :
Safe::header('Status: 304 Not Modified', TRUE, 304);Je vais effectuer des testes mais si tu as déjà la solution Bernard, n'hésite pas.
Comments
| Nuxwin from Caen, devant mon bureau Member 190 posts registered on June 9 2006 | Bien, après avoir effectué plusieurs testes, j'ai trouvé une solution qui semble fonctionner. J'ai remplacer la fonction header(); de la librairie safe.php par celle-ci : Maintenant, reste à savoir si on doit tchecker la version du protocol HTTP pour les vieux browser (HTTP/1.0)... Ce qui me semble dingue ici, c'est qu'il faille faire le contraire de ce qui est recommandé sur plusieurs forums, c'est à dire utiliser HTTP/1.1 losrque que php est exécuté via FastCGI. En effet, dans plusieurs discussions, j'ai pu voir qu'il fallait utiliser Status dans le cas de FastCGI et HTTP/1.1 dans les autres cas. Bref, j'y comprend pas grand chose mais cela fonctionne. Si tu veux bien jeter un coup d'oeil Bernard Note : Je rappelle que ce fix ne concerne que les utilisateurs hébergés sur une machine qui exploite PHP 4 ou 5 en tant que programme CGI via FastCGI. |
| Bernard from nearby-an-airport Associate 6555 posts registered on Sep. 12 2003 | Non seulement je veux bien jeter un coup d'oeil, mais le sujet est bigrement intéressant. La manipulation des headers est l'une des grandes forces du protocole HTTP, qui supporte tous les serveurs web du monde. YACS en tire parti autant que possible, par exemple pour optimiser la gestion du cache, pour rediriger les surfeurs d'une page à l'autre, etc. Les indications fournies ici sont très précieuses, parce qu'elles m'ont fait gagner un temps considérable en recherches diverses. Rien de tel qu'un bug bien documenté pour aller plus vite. Bon, par où commencer ? Tout d'abord, l'origine du problème, bien en évidence dans les messages d'erreur que tu as relevé, c'est un doublon dans le header Status:, ce qui est a priori interdit par l'interface CGI, et correctement supporté dans les autres cas. Donc je vais tout d'abord rechercher ces cas de doublons éventuels dans le code, et je reviens... |
| Bernard from nearby-an-airport Associate 6555 posts registered on Sep. 12 2003 | Bon, je confirme que YACS ne génère pas de doublon, au moins dans les cas de navigation ordinaires (incluant l'édition de pages). |
| Bernard from nearby-an-airport Associate 6555 posts registered on Sep. 12 2003 | Je suggérerai plutôt la modification suivante :
|
| Nuxwin from Caen, devant mon bureau Member 190 posts registered on June 9 2006 |
Bernard : Je te remercie de ta réponse rapide et je suis désolé de t'avoir fait perdre du temps en recherchant des doublons dans le code. Je pensais bien que le problème était ailleurs. J'ai inséré ton fix (pourquoi http 1.0 et pas 1.1 ?) et celui ci semble fonctionner aussi. Maintenant, j'aimerais bien savoir d'où provient le problème exatement.. Si tu as une explication logique au pourquoi du comment, j'aimerais bien que tu m'en fasse part car j'avoue ne pas bien comprendre et moi, j'aime pas quand je comprend pas. Je te remercie par avance pour ton éclairage en la matière. Ce qui est certain, c'est que c'est le genre de bogue qu'il faut absolument fixer de manière définitive dans la mesure ou la plupart des hébergeurs exploitent php via FastCGI. |
| Bernard from nearby-an-airport Associate 6555 posts registered on Sep. 12 2003 |
Nuxwin: Ce que j'ai compris des lectures que j'ai pu faire, c'est que PHP, en mode CGI, supporte mal la gestion du 'Status:', d'où l'idée d'utiliser plutôt 'HTTP/1.0' dans ce cas. Et 'HTTP/1.0' plutôt que 'HTTP/1.1', c'est pour être sûr d'être compatible avec tout le monde. Tout ça est très expérimental en tout cas, et il m'a fallu presque deux heures de lecture pour trois lignes de code ajoutées... En tout cas, c'est grâce à ton intervention et à ton diagnostic initial que le dossier a pu avancer si rapidement. Faute d'environnement FastCGi à ma disposition, je n'aurais pas eu l'idée de me lancer dans ce genre d'investigations par moi-même Le principal est que ton serveur soir reparti, je me suis fait du souci quand j'ai vu qu'il était fermé hier... |
Rate this page
Posted by Nuxwin on Mar. 5, page edited by Bernard on Mar. 11, (popular)