2009-11-18 4 views
1

J'utilise la fonction shell_exec de PHP pour appeler un script bash sur mon serveur.Appel de bash avec shell_exec de PHP - lent

shell_exec("bash -x /tesladata/isetools/0-extractbytickerforweb.bash $ticker $isedate > /t24alv2/iseoutput/$ticker-$isedate-$thistime.log &"); 

Maintenant, j'avais déjà la commande en cours d'exécution d'un script CGI ("bash -x ...") et il était beaucoup plus rapide (instantanée). Maintenant, il faut un temps extrêmement lent pour que le script s'exécute (> 10sec) et que la page résultante soit rendue.

Des idées pour lesquelles c'est si lent? Je voudrais toujours lancer le script bash de PHP et non de CGI, puisque tout mon site est converti en PHP. Peut-être qu'une autre fonction est plus appropriée? Toute idée serait appréciée.

Répondre

4

Vous pouvez jeter un oeil à PHP exec et system fonctions, mais je ne vois pas vraiment pourquoi ils accéléreraient l'exécution du script, ça vaut le coup d'essayer. Je suis sûr que c'est un problème avec Apache (en supposant que vous utilisez Apache), pas PHP la source de cette conclusion étant this bug thread.

Vous devriez également faire très attention à utiliser ces commandes sur un site Web public. Faire usage de escapeshellarg et escapeshellcmd.

3

Pour les utilisateurs Windows exécutant Apache comme service NT: Il semble que vous pouvez améliorer considérablement la shell_exec() ou exec() les performances en configurant le service Apache pour fonctionner avec un compte utilisateur et pas la valeur par défaut compte système. Par exemple, j'ai trouvé que l'exécution d'Apache en tant que service NT standard entraînait des commandes shell_exec() prenant de 15 à 17 secondes (en particulier, l'exécution de commandes svn). La modification du service Apache pour qu'il s'exécute avec un compte d'utilisateur a fait chuter l'heure à 4-5 secondes - une énorme différence. Pour ce faire, ouvrez le panneau de configuration du service, cliquez avec le bouton droit sur le service Apache et sélectionnez Propriétés. Cliquez sur l'onglet Connexion et modifiez le bouton radio "Compte système local" sur "Ce compte". Puis spécifiez le compte d'utilisateur que vous voulez que le service utilise. Notez que je ne suis pas un administrateur admin Windows; l'exécution d'un service avec un compte d'utilisateur peut avoir des implications importantes dont je ne suis pas conscient.

+0

Quelqu'un a-t-il testé cela? Est-ce que quelqu'un sait comment faire cela sous Linux? – Cripto

+0

J'ai testé et ça a marché pour moi. Apache 2.4/PHP 5.4.7/Windows 7 – Marek

+0

Cela a fonctionné pour moi aussi. En utilisant Zend Server CE. –