2017-06-29 3 views
1

私はSymfonyアプリケーションでビデオ変換サービスを使用しています。私の問題は、ビデオ変換がいつ完了するかを知る必要があることです。フローは次のとおりです。ビデオ変換サービスを開始し、ビデオが正常に変換されたときに、ビデオサービスはビデオステータスを「変換済み」に更新します。失敗した場合、ステータスは「失敗」です。動画を投稿する前に動画の状態を確認しておく必要があります。サービスが変換を完了するとPHPが知る

public function setVideo(Post $post, Video $video){ 

    if($video->getStatus() != 'ready_for_conversion'){ 
     throw new ApiException('video cannot be processed'); 
    }else{ 
     $videoService = $this->container->get('app.video_service'); 
     $videoService->submitJob($video); 
     $converting = true; 
     while ($converting) { 
      $status = $video->getStatus(); 
      if($status == Video::STATUS_CONVERTED) { 
       break; 
      }elseif ($status == Video::STATUS_FAILED){ 
       throw new ApiException('video failed'); 
      } 
     } 

     $post->setVideo($video); 
    } 
} 

私はこのコードを実行すると、私はビデオサービスはいくつかの時間後に成功したステータスを更新していても

php.CRITICAL: Fatal Error: Maximum execution time of 30 seconds exceeded

を取得します。

+1

動画が30秒以上変換されているようです。 'set_time_limit(600);を試してみてください。 –

+0

これは、カスタムイベントを利用する良い例です。変換が完了したらイベントをディスパッチし、イベントリスナーでエンティティを更新することができます。あなたはあなたのコンバータのソースまたは少なくともその一部を投稿できますか? – lordrhodos

答えて

2

アプリケーションのアーキテクチャについて詳しく知りませんが、質問に答えるのは難しいです。私はあなたがアップロードしているビデオが処理を完了するために少し時間がかかると仮定するつもりです。ビデオは計算上高価であることが知られているので、安全な賭けのようです。そして、それはあなたがそのエラーから見ることができるようにあなたがコードであることを壊しているものです。基本的には、ビデオを処理するのに30秒以上かかりますが、これは驚くべきことではありません。

これを解決するには、解決策を考え直す必要があります。それを行う最善の方法は、あなたの目標について考え直すことです。あなたのコードのPostオブジェクトがある種の記事またはブログ投稿で、実際に準備が整う前にビデオが表示されたり使用されたりしないようにしようとしている場合は、投稿をビデオに関連付けて、あなたがモデルであることを確認するロジック。その場合は、次のようにすることができます。

class Post 
{ 
    ... 
    public function isVideoAvailable() 
    { 
     return isset($this->video) && Video::STATUS_CONVERTED === $this->getVideo()->getStatus(); 
    } 
} 

次に、表示時または表示時にビューテンプレートにラップします。ここでは小枝の例です:

{% if post.isVideoAvailable() %} 
<div class="video"> 
    <!-- put video embed code here --> 
</div> 
{% endif %} 

あなたはPostに関連付けられているからビデオを防ぐための十分な理由がある場合。次に、これを複数のコントローラーアクションに分割する必要があります。 1つはビデオを受け入れて処理を開始し、もう1つは投票が完了すると投票し、もう1つはビデオを関連付ける(最後の2つを組み合わせるとSRPではないのでちょっと混乱しますが、その理由もあります)。

WebソケットやHTTPストリーミングを使用するのにも他のオプションがありますが、ここで説明するのは複雑になります。

短い答えは、長時間実行されているプロセスに対してWebサービスエンドポイントを使用することは悪いことです。それには、ある時点で浮上する他のパフォーマンス上の問題があるので、そうしないでください。

関連する問題