Forum Programmation.php proc_open : enregistrer l'output de flvstreamer

Posté par  .
Étiquettes : aucune
-1
14
déc.
2012

hello,

J'essaie d’exécuter une instance de flvstreamer et de récupérer l'output pour l'enregistrer dans un fichier txt plat.

Par output, j'entends, le statut, pas le contenu de la vidéo.
Je le fais en php car j'aimerais horodater, sucrifié, chaque ligne de log.

J'essaie de faire cela en php, 5.4.6, je n'exclut pas que cette méthode soit erronée.

Voici comment je procède,

_ la commande qui spawn exécute le process _

flvstreamer -r rtmp://artestras.fcod.llnwd.net/a3903/o35/mp4:geo/videothek/ALL/arteprod/A7_SGT_ENC_06_046289-250-A_PG_MQ_FR?h=2dc6a957fc34a33c4b41a3faee60600f --flv /home/clement/Bureau/pArte/downloads/acab0272ea75fcf85fb949eaf8a4a787364fc8d4.flv  

_ le code qui spawn le process et devrait enregistrer l'output _

                    $command = "... Voir ci dessus..";
                    echo $command;

                    $descriptorspec = array(
                        0 => array("pipe", "r"),  // // stdin est un pipe où le processus va lire
                        1 => array("pipe", "r"),  // stdout est un pipe où le processus va écrire
                        2 => array("pipe", "r"), // stderr est un fichier
                        3 => array("pipe", "r"), // stderr est un fichier
                        4 => array("pipe", "r"), // stderr est un fichier
                        5 => array("pipe", "r"), // stderr est un fichier
                        // 2 => array("file", "$logger_path", "a") // stderr est un fichier
                    );

                    $process = proc_open($command, $descriptorspec, $pipes);

                    if (is_resource($process)) {
                        fclose($pipes[0]);
                        fclose($pipes[1]);
                        fclose($pipes[2]);
                        fclose($pipes[3]);
                        fclose($pipes[4]);

                        $pipe = $pipes[5];

                        stream_set_blocking($pipe, 0);
                        $output = "";
                        do{
                            $output.= stream_get_contents($pipe, 5);
                            $p = strpos($output, PHP_EOL);
                            if( $p > -1 ){
                                $line = substr($output,0,$p);
                                $line = date("[Y-m-d H:I:s] ").$line;
                                file_put_contents($logger_path,$line, FILE_APPEND);
                            }
                            $status = proc_get_status($process);
                            sleep(1);
                            echo "$output\n";
                        }while( $status["running"] );

                        fclose($pipe);

                        $return_value = proc_close($process);

                        echo "La commande a retourné $return_value\n";
                    }

Rien de bien extravagant, excepter les 6 pipes que j'ai ouvert sur le process.
J'ai fait cela pour déterminer le pipe qui émet l'output, sans succès.

Du coup là je galère grave sur un truc simple…

Est ce que vous avez une solution ?

A+

  • # sortie sur STDERR

    Posté par  . Évalué à 3.

    au vue de cette commande, on peut affirmer que les messages sont sur STDERR : flvstreamer --stop 25 -r $url --flv $file 2> 2.log 1>1.log
    - le fichier 2.log contient bien les messages et en particulier la trace concernant le déroulement du téléchargement.
    - le fichier 1.log est vide -> rien sur stdout.

    Il conviendrait de préciser tes objectifs :
    - disposer des informations techniques sur le flux (première partie de la zone de texte)
    - ou avoir l'info sur le téléchargement en temps réel.

    • [^] # Re: sortie sur STDERR

      Posté par  . Évalué à 3.

      ci-joint, un petit script ruby permettant de simuler le fonctionnement de flvstreamer. Ca évitera les tests trop nombreux sur le serveur distant.

      #!/usr/bin/env ruby
      puts "out"
      STDERR.puts "error"
      
      (1..50).each do |c|
          STDERR.printf("\rDownloading : %d%%", c)
          sleep(1)
      end
      
      
    • [^] # Re: sortie sur STDERR

      Posté par  . Évalué à 0. Dernière modification le 16 décembre 2012 à 05:00.

      Salut,

      OK, Merci pour ces retours.

      En effet je n'étais pas suffisamment précis au sujet de 'l'output'.
      Cela concerne les infos de téléchargement qui sont alimentés en temps réel.

      Malheureusement, dans cette technique je dois maintenir deux fichier de log.
      1. pour rediriger l'output vers un fichier a.log
      2. pour lire puis modifier le contenu de a.log, afin de le sauvegarder dans b.log

      Je ne vois pas bien l’intérêt de faire un 2> &1, si proc_open n'arrive déjà pas a lire stderr.

      Je voulais profiter des joies des pipes, dommage, j'irais me rabattre auprès de ma copine.
      Faut il comprendre de tout cela que Php/proc_open est buggé, il n'y à qu'un pas, que je ne ferais probablement pas par manque de temps.

      Je prends note du backend ruby, je lui voit un avenir des plus radieux radieux dans le cadre d'une série de test automatisés.

      a+!

      • [^] # Re: sortie sur STDERR

        Posté par  . Évalué à 2.

        pas beaucoup de réponse sur ce sujet. Ce n'est pas l'absence de réponse qui doit te faire déduire : "Faut il comprendre de tout cela que Php/proc_open est buggé". Donc j'ai compris que tu veux récupérer l'information de téléchargement en temps réel, pour ensuite l'afficher à l'utilisateur. Cela signifie que tu ne peux le faire qu'avec proc_open() et en mode non bloquant. Tu es donc en principe sur la bonne voie. Concernant la lecture je suis surpris par cette ligne de code : $output.= stream_get_contents($pipe, 5); ca devrait plutot être qq chose du genre : stream_get_contents($pipes[$i]); ??

        Si tu n'es pas intéressé pour donner un feedback en temps réel, je pense qu'une solution bien plus simple existe.

        • [^] # Re: sortie sur STDERR

          Posté par  . Évalué à 0.

          Hello,

          J'ai fini par laisser tomber l'idée de faire transiter le flux de sortie pour les re traiter avant de les stocker dans le fichier de log.

          Du coup j'ai un simple lanceur de processus.

          J'ai gardé proc_open par fainéantise d'aller re tester les méthodes exec sytem `` ect

          Sinon oui tu as raison le paramètres supplémentaires à stream_get_contents dans la version originale n'est pas optimum, mais il ne devrait pas non plus provoquer de bug.

          Merci tout de même !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.