2010-11-09 13 views
0

J'essaie d'exécuter une commande en arrière-plan en utilisant PHP afin que l'application web puisse continuer à charger, mais n'ayant pas de chance jusqu'à présent.Exécuter une commande shell en arrière-plan en utilisant PHP

La commande est pour une application de streaming en direct, donc comprend les éléments suivants:

<stream pre-process> | ffmpeg <options> | <stream segmenter> 

je peux coller ci-dessus dans un script et l'exécuter bien en arrière-plan bash avec &, mais cela ne travailler en PHP. J'ai également essayé d'utiliser nohup avant, et "nohup & echo $!", Mais pas de chance.

Je redirige aussi tous les fichiers stderr vers/dev/null, et je peux vérifier dans les journaux apache qu'il n'y a pas de sortie générée lorsque j'exécute la commande (mais elle est en cours d'exécution).

Un exemple de code ci-dessous .. ce que j'ai après ce code ne s'exécute pas jusqu'à ce que cela se termine, ce qui est une longue période.

function streamVid ($mid, $width, $height, $br) { 
    $cdir = "./temp"; 
    $zmstrm = "zmstreamer -m ".$mid." 2> /dev/null"; 
    $seg = "segmenter - 3 ".$cdir."/sample_".$mid." ".$cdir."/stream_".$mid.".m3u8 ./ 2>/dev/null"; 
    $ffparms = "-f mpegts -analyzeduration 0 -acodec copy -s ".$width."x".$height." -vcodec libx264 -b ".$br." -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate ".$br." -bufsize ".$br." -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -analyzeduration 0 -async 2 - 2> /dev/null"; 
    $url = $zmstrm . " | ffmpeg -t 10 -analyzeduration 0 -i - ". $ffparms . " | " . $seg; 
    shell_exec("nohup ". $url." & echo $!");  
    ob_flush(); 
    flush(); 
} 

Répondre

0

Si vous avez besoin de diffuser le résultat d'une opération, utiliser le système ou les méthodes PassThru, ou utiliser popen ou proc_open d'avoir un contrôle total sur l'entrée et la sortie du processus.

En général, les scripts PHP qui sont déclenchés par votre serveur Web sont destinés à générer une page et à quitter. Ils ne sont pas le meilleur endroit pour faire des tâches d'arrière-plan telles que l'encodage vidéo, votre serveur web imposera une limite sur le temps d'exécution des programmes, et il sera difficile d'obtenir des informations d'état de votre navigateur. Votre meilleur pari est de créer un processus démon séparé dans une langue comme Python (ou PHP) qui fonctionnera sur votre ordinateur. Lorsque vos scripts Web doivent transcoder une vidéo, ils peuvent placer les informations nécessaires dans une base de données ou un fichier qui peut être interrogé par le processus démon. Le processus démon peut également mettre à jour la base de données avec des informations d'état. En général, vos pages Web doivent être aussi "non bloquantes" que possible, ce qui signifie que si quelque chose va prendre plus d'une seconde ou deux, faites-le en arrière-plan et créez des pages sur votre site pour permettre l'utilisateur pour voir l'état des opérations et le manipuler.

+0

Merci Zack. L'intention n'est pas de bloquer cela, et j'imagine que j'essaie d'implémenter la fonctionnalité «démon» en ligne, mais ce n'est peut-être pas possible. Mais pour clarifier, je ne veux pas diffuser le résultat de cette opération; Cette chaîne de commande crée des fichiers sur le disque auxquels accède un élément HTML-5 (que le programme PHP va créer). Je vais jeter un coup d'œil à une approche démon, mais espérais quelque chose de plus simple pour faciliter le déploiement sur le terrain. –