Exécuter un ffmpeg processus en arrière-plan
Je suis désireux d'utiliser ffmpeg pour convertir la vidéo .flv en php. Actuellement j'ai ce travail, mais il bloque le navigateur jusqu'à ce que le fichier est téléchargé et il est fini. J'ai été regarder le php docs sur la façon d'exécuter un exec() processus en arrière-plan, tout en mettant à jour le processus en utilisant le retour PID. Voici ce que j'ai trouvé:
//Run linux command in background and return the PID created by the OS
function run_in_background($Command, $Priority = 0)
{
if($Priority)
$PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
else
$PID = shell_exec("nohup $Command > /dev/null & echo $!");
return($PID);
}
Il y a aussi un truc que j'utilise pour vérifier si la tâche en arrière-plan est en cours d'exécution à l'aide de l'retourné PID :
//Verifies if a process is running in linux
function is_process_running($PID)
{
exec("ps $PID", $ProcessState);
return(count($ProcessState) >= 2);
}
Suis-je suppose que pour créer un document distinct .fichier php qui exécute alors à partir de la cli php à exécuter l'une de ces fonctions? J'ai juste besoin d'un petit coup de coude dans le démarrage de ce travail, et puis je peux le prendre à partir de là.
Merci!
OriginalL'auteur Nic Hubbard | 2009-07-29
Vous devez vous connecter pour publier un commentaire.
C'est probablement la façon dont je voudrais faire :
Voici quelques autres idées :
Votre "script de traitement" devrait être lancer toutes les deux minutes ; vous pouvez utiliser cron pour que, si vous êtes sur un Linux de la machine.
Edit : un peu plus d'informations, après avoir vu le commentaire
Que la partie traitement est fait à partir de la CLI, et non pas à partir d'Apache, vous n'avez pas besoin d'échapper aucune impression de "fond" manipulations : vous pouvez simplement utiliser
shell_exec
, qui sera de retour l'ensemble de la sortie de la commande à votre script PHP, quand elle a fini de faire son travail.Pour l'utilisateur qui regarde la page web en disant "traitement", il semble comme traitement de fond ; et, en un sens, ça va être, comme le traitement sera effectué par un autre processus (peut-être même sur une autre machine).
Mais, pour vous, il va être beaucoup plus simple :
Votre script de traitement pourrait ressembler à quelque chose comme ceci, je suppose :
Vraiment plus facile que ce que vous avez d'abord pensé, n'est-ce pas ? 😉
Il suffit de ne pas inquiéter l'arrière-plan des trucs plus : la seule chose importante, c'est que le script de traitement est lancé régulièrement, de crontab.
Espérons que cela aide 🙂
OriginalL'auteur Pascal MARTIN
Vous n'avez pas besoin d'écrire un distinct script php pour faire cela (Si vous voulez plus tard si vous mettez en place une sorte de système de file d'attente).
Vous y êtes presque. Le seul problème est, l'shell_exec() appel de blocs à attendre le retour de la coque. Vous pouvez éviter cette situation, si vous rediriger toute sortie de la commande dans le shell pour flétrir un fichier ou /dev/null et le fond de la tâche (à l' & operator).
Ainsi, votre code devient:
Je ne pense pas qu'il n'y a aucun moyen de récupérer le PID, malheureusement.
OriginalL'auteur Brenton Alker