L'exécution d'un exec() ou system() en PHP et ne pas attendre pour la sortie
Je veux déclencher une commande shell dans eider exec() ou system() dans un script PHP, mais c'est une tâche que prendre un certain temps, est-il un moyen de le déclencher et de poursuivre l'exécution du PHP de la page charge sans délai?
Edit: je suis sur CentOS 6, PHP 5.3
OriginalL'auteur adrianTNT | 2012-01-18
Vous devez vous connecter pour publier un commentaire.
Dépend de l'OS que vous utilisez.
Pour linux:
avis de la amperstand à la fin (très important).
Pour windows:
ici la
start
mot-clé est important.Espère que cette aide.
exec("php video_processor.php &");
et le délai est le même, et puis aussi si j'ai mis unsleep(10)
à l'intérieur video_processor.php alors mon script parent attend également pendant 10 secondes.Essayez avec
pclose(popen("php video_processor.php &","r"));
oupclose(popen("/usr/bin/php video_processor.php &","r"));
(je suppose que votre PHP est installé dans l'emplacement par défaut)Il a travaillé avec celui-ci:
pclose(popen("php video_processor.php &","r"));
alors j'ai édité le mien et il a travaillé:pclose(popen("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg &","r"));
Merci. :party: 🙂Wow, je ne peux pas croire comment facile et simple c'est de le faire! Excellente solution! J'ai fait des recherches à une certaine longueur avant et toutes les autres solutions recommandé des stratégies complexes pour bifurquer ou d'enfiler un processus PHP.
Windows spécifiques commentaire: j'ai l'habitude d'utiliser: pclose(popen("start /B php.exe somefile.php","r")); comme de Windows 10 Créateurs de mise à Jour (1703) - le "/B" arrière-plan de l'interrupteur pour "démarrer" de commande ne fonctionne pas. Content de voir qu'il n'est pas nécessaire.
OriginalL'auteur Eduard Luca
Cela ne veut pas répondre directement à votre question, mais vous devriez envisager de faire votre vidéo, le travail de conversion dans un processus d'arrière-plan avec une tâche cron ou à l'aide d'une file d'attente comme Beanstalkd.
De cette façon, vous pouvez empiler jusqu'votre ffmpeg travail en arrière-plan sans blocage de votre serveur web.
J'ai eu beaucoup de succès avec les deux méthodes (cron /file d'attente) dans le passé.
Certains autres postes, sur les processus d'arrière-plan:
php d'exécuter un processus d'arrière-plan
Exécuter un ffmpeg processus en arrière-plan
En utilisant ffmpeg, PHP et beanstalk
Quelques outils qui peuvent vous être utiles:
http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
POIRE System_Daemon
Pheanstalk, un Beanstalkd bibliothèque pour PHP
OriginalL'auteur Darren Newton
Bien utiliser une requête ajax pour activer la commande exec partie ...puis continuer avec les autres tâches
Je n'ai pas le niveau 1. Guy a donné une réponse courte. Peut-être n'aimait pas, mais toujours juste.
Je n'ai pas donner un -1
Après avoir essayé toute autre solution qui a finalement réussi à le faire fonctionner à l'aide de votre suggestion. Merci beaucoup!
OriginalL'auteur poojitha
Cela devrait fonctionner:
Edit: désolé, je ne sais pas pourquoi j'ai exclu le & mettre en bg
2> redirige STDOUT et STDERR vers /dev/null.
shell_exec("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg 2> /dev/null");
essayez: shell_exec("nohup ffmpeg -i" vidéos/échantillon.mp4 "- qmax 1 -vframes 1 -ss 80 videos/images/1.jpg > /dev/null 2> /dev/null")
Même délai, la commande exécutée amende. Peut-être ffmpeg seulement des actes différemment?
Juste testé moi-même avec PHP et ffmpeg et maintenant ça fonctionne.
OriginalL'auteur Uku Loskit
Ce que je fais:
OriginalL'auteur Michael J. Calkins