0 votes

exec("php -v") vs phpinfo() -- version différente de php

J'ai mis à jour la version de PHP sur mon Mac à 7.3 avec une commande

curl -s http://php-osx.liip.ch/install.sh | bash -s 7.3

et ensuite

export PATH=/usr/local/php5/bin:$PATH

Quand je tape php -v dans le terminal, la nouvelle version s'affiche correctement.


J'utilise Apache livré avec MacOS.

J'ai créé un document simple dans localhost/phpinfo.php qui contient :

echo exec('which php');

echo '<br>';

$out = [];
exec("php -v" , $out);
foreach($out as $line) {
    echo $line, '<br>';
}

phpinfo();

Le site phpinfo() montre le nouveau PHP 7.3.8 comme prévu, mais les lignes précédentes, utilisant exec() produisent un résultat différent.

enter image description here

Je me demandais si quelqu'un pouvait m'expliquer pourquoi cela se produit, si c'est important et s'il est possible d'y remédier.

0 votes

Je ne suis pas sûr de ce que vous voulez dire par "dans un navigateur" ? Quel serveur web/SAPI utilisez-vous ?

0 votes

Le commentaire concernant l'utilisation de .bash_profile est faux. Cependant, la réponse correcte dépend de la clarté avec laquelle vous exécutez l'application et de la manière dont vous voulez exécuter l'application sans tête.

0 votes

J'ai mis à jour la question, en espérant qu'elle soit plus claire.

1voto

Jose Chavez Points 645

Cela se produit parce que l'ancien binaire PHP est toujours installé (probablement dans le dossier /usr/bin ).

Lorsque vous changez votre PATH variable d'environnement sur la commande à inclure /usr/local/bin - cela signifie que l'interpréteur de commandes effectue également une recherche dans ce dossier (et dans cet ordre) pour trouver le programme que vous voulez exécuter. Dans ce cas, lorsque vous exécutez php, il trouve la nouvelle version dans le dossier /usr/local/bin et s'en occupe pour vous.

Cependant, cette PATH La modification de la variable d'environnement est locale à cette session du shell uniquement. Elle n'est enregistrée nulle part et n'est pas utilisée dans d'autres contextes.

Ainsi, lorsque vous exécutez le phpinfo.php script par l'intermédiaire du serveur web, il s'exécute avec une interface standard. PATH qui n'inclut pas /usr/local/bin . Ainsi, l'ancien binaire PHP est exécuté - montrant l'ancien numéro de version.

Cela n'a vraiment aucune importance - pourquoi voudriez-vous exécuter un binaire PHP à partir d'un script PHP exécuté par le serveur web de toute façon ?

Au cas où vous voudriez vraiment le faire et que vous vouliez le "réparer", vous pouvez le faire soit en changeant votre exec() pour inclure le chemin complet :

exec("/usr/local/bin/php -v" , $out);

ou en modifiant le PATH dans votre contexte PHP script.

0 votes

Je pense que certaines applications web pourraient utiliser exec() et les résultats pourraient être imprévisibles/difficiles à déboguer si les versions de PHP sont différentes, d'où ma question. Je comprends que cela n'a pas vraiment de sens de "lancer un binaire PHP à partir d'un script PHP". Merci pour votre réponse complète.

0 votes

Hmm, ce serait des applications web bizarres je dirais... ce n'est certainement pas en haut de la "liste recommandée" pour les développeurs... en pratique je ne pense pas que vous aurez des problèmes.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X