7
votes

Exécuter un EXED () ou un système () en PHP et n'attendez pas la sortie

Je veux déclencher une commande shell dans Eider Exec () ou System () à partir du script PHP, mais il s'agit d'une tâche qui prend un certain temps, existe-t-il un moyen de le déclencher et de continuer à exécuter la charge de la page PHP sans délai ?

EDIT: Je suis sur Centos 6, PHP 5.3


0 commentaires

5 Réponses :


0
votes

Eh bien utiliser une demande Ajax pour activer la partie EXEC ... puis continuer avec les autres tâches


3 commentaires

Cela fonctionnerait probablement, mais il devrait y avoir une manière plus facile et plus fiable, comme un paramètre à la fin de l'exécutif () ou du système ();


Je ne reçois pas le niveau de -1. Guy a donné une courte réponse. Peut-être pas aimé, mais toujours juste.


Après avoir essayé toute autre solution, a finalement réussi à le faire fonctionner en utilisant votre suggestion. Merci beaucoup!



0
votes

Cela devrait fonctionner:

shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");


4 commentaires

Commande s'exécute, mais le délai est là, il s'agit de la commande complète: shell_exec ("ffmpeg -i 'vidéos / exemple.mp4' -qmax 1 -vframes 1 -SS 80 vidéos / images / 1.jpg 2> / Dev / null ");


Essayez: shell_exec ("nohup ffmpeg -i 'vidéos / échantillon.mp4' -qmax 1 -vframes 1 -SS 80 Vidéos / Images / 1.jpg> / dev / null 2> / dev / null")


Même retard, commande exécutée bien. Peut-être que FFMPEG agit juste différemment?


Je viens de tester cela moi-même avec PHP et FFMPEG et cela fonctionne maintenant.



16
votes

dépend du système d'exploitation que vous utilisez.

pour Linux: xxx

Notez l'amperstand à la fin (très important).

Pour Windows: xxx

ici, le mot clé est important.

espère que cela aide.


5 commentaires

J'ai essayé exécu ("php video_processor.php &"); et retarder est identique, alors si je défini un veille (10) inside video_processor.php puis mon parent Le script attend également 10 secondes.


Essayez avec pclose (popen ("php video_processor.php &", "r")); ou pclose (popen ("/ USR / bin / php vidéo_processor.php &", "r ")); (je suppose que votre PHP est installé dans l'emplacement par défaut)


Il a fonctionné avec celui-ci: pclose (popen ("php video_processor.php &", "r")); alors j'ai édité la mienne et cela a fonctionné: pclose ("FFMPEG - i 'vidéos / échantillon.mp4' -qmax 1 -vframe 1 -SS 80 vidéos / images / 1.jpg & "," r ")); merci. :fête: :)


Wow, je ne peux pas croire à quel point c'est facile et facile à faire! Solution brillante! J'ai déjà étudié cela à une certaine longueur avant et toutes les autres solutions recommandées des stratégies complexes de forking ou de filetage d'un processus PHP.


Commentaire spécifique Windows: J'avais l'habitude d'utiliser: pclose (popen ("start / b php.exe quelquefile.php", "r")); À la mise à jour des créateurs de Windows 10 (1703) - l'interrupteur d'arrière-plan "/ b" pour la commande "Démarrer" ne fonctionne pas. Content de voir que ce n'est pas nécessaire.



3
votes

Cela ne répond pas directement à votre question, mais vous devriez envisager de faire votre conversion vidéo dans un processus d'arrière-plan avec un travail cron ou à l'aide d'une file d'attente telle que BeansTalkd.

De cette façon, vous pouvez empiler votre travail FFMPEG en arrière-plan sans bloquer votre serveur Web.

J'ai eu beaucoup de succès avec les deux méthodes (cron / file d'attente) dans le passé.

Quelques autres messages sur les processus de fond:

PHP Exécutez un processus d'arrière-plan

​​Exécuter un processus FFMPEG en arrière-plan

Utiliser FFMPEG, PHP et BeanStalk

Certains outils que vous pourriez trouver utiles:

http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

PEAR System_Daemon

ESSEANSTALK, une bibliothèque BeanStalkD pour PHP


0 commentaires

2
votes

Ce que je fais: xxx


1 commentaires

Semble fonctionner avec juste en-tête ('"Longueur de contenu: 0'); Flush (); pour moi