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 ? p>
EDIT: Je suis sur Centos 6, PHP 5.3 P>
5 Réponses :
Eh bien utiliser une demande Ajax pour activer la partie EXEC ... puis continuer avec les autres tâches p>
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!
Cela devrait fonctionner:
shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");
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 "); code>
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.
dépend du système d'exploitation que vous utilisez.
pour Linux: p> Notez l'amperstand à la fin (très important). P> Pour Windows: p> ici, le mot clé code> est important. P> espère que cela aide. P> p >
J'ai essayé exécu ("php video_processor.php &"); code> et retarder est identique, alors si je défini un
veille (10) code> inside video_processor.php puis mon parent Le script attend également 10 secondes.
Essayez avec pclose (popen ("php video_processor.php &", "r")); code> ou
pclose (popen ("/ USR / bin / php vidéo_processor.php &", "r ")); code> (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")); code> 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 ")); code> 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.
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. P>
De cette façon, vous pouvez empiler votre travail FFMPEG en arrière-plan sans bloquer votre serveur Web. P>
J'ai eu beaucoup de succès avec les deux méthodes (cron / file d'attente) dans le passé. P>
Quelques autres messages sur les processus de fond: p>
PHP Exécutez un processus d'arrière-plan P>
Exécuter un processus FFMPEG en arrière-plan p>
Utiliser FFMPEG, PHP et BeanStalk P>
Certains outils que vous pourriez trouver utiles: p>
http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/ a> p>
Ce que je fais:
Semble fonctionner avec juste en-tête ('"Longueur de contenu: 0'); Flush (); code> pour moi