0

私の問題は、FFMpegとMencoderは非常に機知に富んでいて、1つのプロセスでも実行するとHTTPdの速度が低下しますが、(FFMPEG / Mencoder)の複数のプロセスは完全にハングします(HTTPd)。たとえば、変換をBeanstalkで処理したいと思います。

私の具体的な質問は、現在の仕事をBeanstalkに転送する方法です。

変換をトリガーする単純なPHPコードがあります。

RunInBackground('convert.php', array($upload, $video_id), $log_path);

複数のビデオがアップロードされた場合にこれらのプロセスがすべて同時に開始されないように、Beanstalkの正しいコードはどのようになりますか?

私のニーズのためにBeanstalk以外のものを使用する方が良いと信じていて、それを実装する方法を知っているなら、それでも私はそれを見てうれしいです!

よろしくお願いします、
イリア

4

2 に答える 2

3

2つの可能性:
-変換にxugglerを試してください-ジョブを生成する代わりにインラインで実行します-db
またはfileを使用して「ファイルプロセスキュー」を作成します..変換プロセスに「処理する未処理のファイル」を照会するだけですが、これらの1つは一度に実行されます。メインタスクとは独立して実行されますが、メインジョブが読み取れる場所にステータスを投稿できます。EG「ビジー」または「キュー内の3つのファイル」または「利用可能」

于 2012-07-13T16:48:47.670 に答える
1

ethrbunnyから提供された素晴らしいアイデアに基づいて、BeanstalkやResqueを使用せずに目標を達成することにしました。やっぱり嬉しかったです!FFMpeg / MPlayer / MEncoderプロセスをサーバー上の唯一のアクティブなプロセスに制限しようとしているすべての人にとって、たとえばhttpdなどの他のプロセスを正常に実行し続けることができると便利だと思います。

ステップバイステップ!

  1. データベースを作成します。これを「encoding_queue」と呼びます。

     CREATE TABLE IF NOT EXISTS `encoding_queue` (
    `queue_timestamp` int(11) NOT NULL DEFAULT '0',
    `uploaded_video_id` int(11) NOT NULL DEFAULT '0',
    `uploaded_file_name` varchar(255) NOT NULL DEFAULT '',
    `log_file_path` varchar(255) NOT NULL DEFAULT '',
    PRIMARY KEY (`queue_timestamp`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
    
  2. メインのアップロードファイルで、変換プロセスをトリガーする場所:

    // Let's check if ffmpeg, mplayer, mencoder or mediainfo processes are running //   
    exec("ps ax | grep -v grep | grep ffmpeg", $ffmpeg);
    exec("ps ax | grep -v grep | grep mplayer", $mplayer);
    exec("ps ax | grep -v grep | grep mencoder", $mencoder);
    exec("ps ax | grep -v grep | grep mediainfo", $mediainfo);
    
    if(empty($ffmpeg) && empty($mplayer) && empty($mencoder) && empty($mediainfo)) {
    // As non of them are running we start conversion process //
    
       RunInBackground('convert.php', array($uploaded_file_name , $uploaded_video_id ), $log_file_path);
    
    } else {
    
    // As the ffmpeg or mplayer or mencoder or mediainfo is running we add the process to the queue into the database//
    
       //Connecting to database using ADOdb //             
    
       $sql = "INSERT INTO encoding_queue SET queue_timestamp = '" .time(). "', 
       uploaded_video_id = '" .mysql_real_escape_string($uploaded_video_id ). "',
       uploaded_file_name = '" .mysql_real_escape_string($uploaded_file_name ). "',
       log_file_path = '" .mysql_real_escape_string($log_file_path). "'";
       $conn->execute($sql);
    }
    
  3. データベースに値を追加した後、前の変換が終了したかどうかを確認し、新しい変換を開始する準備ができているかどうかを確認する必要があります。convert_queue.phpファイルを作成し、それをCRONジョブに追加します。たとえば、5分ごとに追加します。

    <?php
    require('path/to/your/config.php');
    require('path/to/your/function.php');
    
    exec("ps ax | grep -v grep | grep ffmpeg", $ffmpeg);
    exec("ps ax | grep -v grep | grep mplayer", $mplayer);
    exec("ps ax | grep -v grep | grep mencoder", $mencoder);
    exec("ps ax | grep -v grep | grep mediainfo", $mediainfo);
    
    $sql = "SELECT * FROM encoding_queue ORDER BY queue_timestamp ASC LIMIT 1";
    $rs = $conn->execute($sql);
    $queue = $rs->getrows();
    if ( $conn->Affected_Rows() == 0 ) {
    die ("Error! There is no records in the database. Nothing to convert. Stopping...");
    }
    if (file_exists($config['VDO_DIR'] . '/' .$queue[0]['uploaded_file_name'])) {
      if(empty($ffmpeg) && empty($mplayer) && empty($mencoder) && empty($mediainfo)) {
         RunInBackground('convert.php', array($queue[0]['uploaded_file_name'], $queue[0]['uploaded_video_id']), $queue[0]['log_file_path']);
    } else {
         die ("Another conversion process is still in progress. Stopping...");
     }
      } else { 
         die ("Error! There is no video file ".$queue[0]['uploaded_file_name']." found. Nothing to convert. Stopping..."); }
     ?>
    
  4. 最後に、キューの最初のエントリを処理したら、データベースから削除して、convert_queue.phpが他のエントリで動作を開始できるようにする必要があります。クリーンアップのどこかで実行するか、convert_queue.phpに追加しますが、プロセスが失敗した場合、再度再起動することはできません。

    $sql = "DELETE FROM encoding_queue WHERE uploaded_video_id = '" .mysql_real_escape_string($uploaded_video_id ). "' LIMIT 1";
    $conn->execute($sql);
    

では、何が得られるのでしょうか。アップロードされたファイルが現時点で唯一のものであり、サーバー上で現在発生している変換がない場合は、変換プロセスを開始します。アップロードされたファイルに関する情報をデータベースに入れて、すでに変換されているビデオファイルがある場合は、他のファイルの変換が終了したときに、すぐに変換を開始するのを待ちます。

キューは実際のキューです-ファイルはアップロード時間に基づいて処理されています!

これはFFMpeg/MPlayer / MEncoderキューソリューションです!

よろしくお願いします、イリア

于 2012-07-14T07:52:18.827 に答える