2017-09-04 1 views
3

Ok, après avoir tapé 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.PHP exec() sous Apache renvoie null et 255 lors de l'exécution d'un script

Cela fonctionne très bien sur mon bureau avec Windows 10. Toutefois, sur le serveur, exec() retourne « null » et un code de sortie de 255.

Je lis tout ce que je pouvais trouver sur les questions exec() et j'ai essayé ce qui suit:

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

J'ai obtenu la bonne réponse contenant les informations de version de PHP.

Alors j'ai décidé de vérifier les fichiers de configuration:

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

Tous les fichiers étaient en place.

Puis j'ai décidé d'effectuer une vérification de 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é.

Enfin j'ai décidé de vérifier le compte utilisateur:

exec("whoami", $output); 

obtenu "NT AUTHORITY \ SYSTEM" comme prévu. Pour vous assurer que le script a pu exécuter sous le compte SYSTEM je Sysinternals PsExec:

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

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

Alors, je décidé de vérifier les erreurs « cachées » dans mon code en ajoutant les deux lignes suivantes au début du script:

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

Mais, pas de joie. Et je n'ai plus d'idées.

Une bonne âme peut-elle m'aider?

Merci beaucoup,

Miguel.

Répondre

0

Enfin! La clé de la réponse était ici: PHP exec() git fetch failing with return value 255.

Je n'ai pas pu voir d'erreur, même en ajoutant la redirection de tuyau "2> & 1" à mes commandes. Après avoir lu cet article, j'ai appris que proc_open() est bien meilleur que exec().Je cite la documentation de PHP:

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

Alors, je l'ai remplacé mon exec() pour quelques lignes de code (se référer à l'exemple dans le manuel) et a constaté que le problème était provoqué par le Zend Opcache, qui a été activé pour CLI. La solution la plus rapide pour moi était de le désactiver dans la ligne de commande:

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

Voilà! Problème résolu!