PHP exec () sous Apache renvoie null et 255 lors de l’exécution d’un script

Ok, après avoir frappé la tête pendant des heures, j’ai décidé de demander de l’aide. J’ai un Windows Server 2008 exécutant Apache 2.4 et PHP 7.1. Mon application doit exécuter un script PHP sur le serveur lorsque l’utilisateur clique sur un bouton du navigateur.

Cela fonctionne correctement sur mon bureau avec Windows 10. Cependant, sur le serveur, exec () renvoie “null” et un code de sortie de 255.

J’ai lu tout ce que je pouvais trouver sur les problèmes exec () et essayé ce qui suit:

exec("C:\\PHP7\\php.exe -v", $output); 

J’ai reçu la bonne réponse contenant les informations de version de PHP.

Puis j’ai décidé de vérifier les fichiers de configuration:

 exec("C:\\PHP7\\php.exe --ini", $output); 

Tous les fichiers étaient en place.

Ensuite, j’ai décidé d’effectuer une vérification de la syntaxe sur mon script:

 exec("C:\\PHP7\\php.exe -d display_errors=1 -l C:\\Apache24\\htdocs\\script.php", $output); 

Aucune erreur n’a été trouvée.

Finalement j’ai décidé de vérifier le compte utilisateur:

 exec("whoami", $output); 

A obtenu “NT Authority \ SYSTEM” comme prévu. Pour m’assurer que le script a pu être exécuté sous le compte SYSTEM, j’ai utilisé SysInternals psexec:

 psexec -s C:\PHP7\php.exe C:\Apache24\htdocs\script.php 

Tout s’est bien passé.

En d’autres termes, le script ne présente aucun problème lorsqu’il est exécuté à partir de la ligne de commande, soit sous un compte utilisateur, soit sous un compte système. J’ai également prouvé que PHP est correctement appelé par exec ().

Alors, j’ai décidé de vérifier les erreurs “cachées” dans mon code en ajoutant les deux lignes suivantes au tout début du script:

 error_reporting(E_ALL); ini_set('display_errors', 1); 

Mais pas de joie. Et je suis à court d’idées.

Est-ce qu’une bonne âme peut m’aider?

Merci beaucoup,

Miguel.

Finalement! La clé de la réponse était ici: PHP exec () git fetch failing avec la valeur de retour 255 .

Je n’ai pu voir aucune erreur, même en ajoutant la redirection de canal “2> & 1” à mes commandes. Après avoir lu cet article, j’ai appris que proc_open () est bien meilleur que exec (). Citant de la documentation de PHP:

proc_open () est similaire à popen () mais offre un plus grand degré de contrôle sur l’exécution du programme

J’ai donc remplacé mon exec () par quelques lignes de code (reportez-vous à l’exemple du manuel) et constaté que le problème était dû au Zend Opcache, activé pour la CLI. La solution la plus rapide pour moi était de la désactiver dans la ligne de commande:

 php.exe -d opcache.enable_cli=0 myscript.php 

Voilà! Problème résolu!