Bug étrange, PHP appelant PHP CGI via system

Petit nouveau ! | 4 Messages

23 août 2012, 12:44

Bonjour à tous,

Alors voila, je viens vers vous en dernier recours, je suis face à un problème jamais vu auparavant...
Je cherche donc des pistes, donc n'hésitez pas à proposer des solutions, je les essayerai.

Voulant tester un programme php autonome qui sera appelé via un cron (et qui se trouve donc hors racine web), j'utilise la commande system().
Imaginons l'arborescence suivante :
/app/bin/monprog.php <= le prog indépendant
/www/index.php <= le script appelant, dans la racine web qui est "www"

Notez que j'ai volontairement simplifié les chemins mais que j'ai bien les bons chemins absolus dans mon code réel...

Mon code est alors le suivant dans index.php :
<?php
system('/usr/bin/php5 /app/bin/monprog.php');
Dans monprog.php :
<?php
echo 'Bonjour';
Je me retrouve avec une boucle sans fin qui plante mon navigateur... Après de très nombreux tests, il s'avère que la commande system envoyée se comporte comme si je lui envoyais le nom du fichier en cours (soit index.php)...
Alors j'ai voulu tricher et passer par un shell...

La commande de index.php se transforme alors en : /app/monshell.sh
Le fichier monshell.sh est constitué comme ceci :

Code : Tout sélectionner

#!/bin/bash /usr/bin/php5 /app/bin/monprog.php > /app/result.txt
Notez que j'envoie le résultat dans /app/result.txt pour être certain d'être indépendant du programme racine...

Eh bien figurez-vous que je récupère le même bouclage...

En réalité, j'ai compris que j'avais ce bouclage car j'ai fais tourner ce script sur php5.2 alors que j'ai une fonction anonyme 5.3... Ainsi, il me donne une parse et stop le bouclage infini.
Seulement voila, c'est toujours la même chose... dans result.txt, j'obtiens : Parse error, T_FUNCTION blablabla in file index.php et non pas monprog.php !

Là, je sèche complet, alors comme dit plus haut, tout idée qui vous passerait par la tête est bonne à entendre.
Pour info, pas de safemode activé, pas de truc farfelu côté config, on est sur une release2 ovh je crois.
J'ai testé sur un autre serveur et ça marche correctement, c'est donc bien un problème local et pas général à php.

ViPHP
ViPHP | 2287 Messages

23 août 2012, 14:02

Bonjour,

Comme tu ne nous donne pas les vrais chemins on ne peut que faire des suppositions, cependant tu peux toujours essayer cette fonction : http://fr2.php.net/manual/fr/function.e ... ellarg.php
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 2577 Messages

23 août 2012, 14:08

Bonjour,

C'est peux être parce que c'est le PHP cli qu'il faut lancer et pas le cgi.

Sous ubuntu (et Debian ?), il y a 2 paquets différents :
ii php5-cgi 5.1.6-1ubuntu2.3 server-side, HTML-embedded scripting languag
ii php5-cli 5.1.6-1ubuntu2.3 command-line interpreter for the php5 script

La commande est plutôt "php test.php" que "php5 test.php"

Petit nouveau ! | 4 Messages

23 août 2012, 14:28

Merci pour vos réponses :

Concernant les vrais chemins, pas de risque là dessus, c'est sûr qu'ils ne contiennent pas de caractères farfelus etc. On élimine donc ce cas.
Concernant les différents paquets, lorsque je fais un ls des paquets installés dans /usr/local/php53/bin, j'obtiens php, php-cgi, php-config et phpize.

L'appel via "php" ou "php5" ne donne rien, il faut le chemin complet.
J'ai le même problème d'utiliser php4, 5.2 et 5.3.

Ce que je ne comprends pas du tout, c'est pourquoi l'appelle de php5 monfichier.php n'exécute pas monfichier.php... Ce qui est très surprenant également, c'est que même encapsulé dans un shell, l'appel de php5 accède directement au fichier appelant le shell, cad index.php...

Merci d'avoir proposé des solutions en tout cas.

ViPHP
xTG
ViPHP | 7331 Messages

23 août 2012, 14:36

Et si tu accèdes à une console et que tu exécutes la commande ?

Petit nouveau ! | 4 Messages

23 août 2012, 14:42

Excellente question à laquelle j'aurais du répondre depuis le début... ça marche.

Donc pour récapituler :
- Si on saisi "/usr/bin/php5 /app/bin/monprog.php" dans une console, tout marche.
- Si on saisi "/usr/bin/php5 /www/index.php" dans une console, l'appel de monprog.php marche bien, tout marche.
- Si on accède à domain.tld/index.php, alors là, bouclage infini, qui indique (c'est sûr et certain) que l'appel de monprog.php via system() ne marche pas et rappelle en réalité index.php en récursif.

Je précise également que j'ai tenté de changer les noms des fichiers et dossiers, viré les .htaccess qui trainaient par là... rien n'y fait !

EDIT : j'ajoute au passage que system, exec, shell_exec, passthru et `commande` ont été testés...

ViPHP
ViPHP | 2577 Messages

23 août 2012, 14:54

...
- Si on saisi "/usr/bin/php5 /www/index.php" dans une console, l'appel de monprog.php marche bien, tout marche.
- Si on accède à domain.tld/index.php, alors là, bouclage infini, qui indique (c'est sûr et certain) que l'appel de monprog.php via system() ne marche pas
et rappelle en réalité index.php en récursif.
...
Tu es sur que domaine.tld pointe sur /www ?
Fais un fichier index.php avec uniquement une echo 'index' et l'appel à system(). Si tu as un redirect dans index.php, il ne marche pas en ligne de commande.

Petit nouveau ! | 4 Messages

23 août 2012, 15:06

Sûr que domain.tld a pour racine web le www.
Lorsque je mets des commandes genre "ls -l" dans le system du même fichier, ça marche correctement.
Lorsque je mets l'option --help sur php5, ça marche correctement.
Lorsque je mets une autre option (genre -v ou -i), ça part sur index.php...

J'ai tenté de mettre " &" à la fin de ma commande unix, ça bug pareil.
J'ai tenté de mettre l'option "-f" à php afin qu'il reconnaisse comme un nom de fichier... pareil.

J'ai un .htaccess qui envoie tout ce qui n'est pas un .jpg etc sur index.php (=bootstrap), mais même en renommant ce fichier, ça plante pareil. De toute façon, la commande system ne devrait pas être impactée par le .htaccess, d'autant plus que je donne le chemin absolu à l’interpréteur.

Pour ma part, je vais laisser tomber ce truc hallucinant pour retourner à mes moutons, j'ai déjà assez perdu de temps, je vais contourner le problème...

En tout cas, merci les gars pour le temps que vous consacrez à ces problèmes... Je vais tâcher d'accorder un peu de temps comme vous aux plus débutants, pour ma part, je suis certifié php5, je pense donc pouvoir en aider quelques-uns :-)
Mais là, un "bug" pareil, je jette l'éponge !

PS : aucune redirection dans index.php, j'ai copié dans le premier message le contenu de mes fichiers, je les avais rendu les plus simples possibles afin d'isoler "le bug"...
Donc juste system() dans index et juste echo 'bonjour'; dans le script qui devrait être appelé par system...