私は現在、インターネットでのビデオの共有に関するWebサイトを開発しています。フローは次のとおりです。ユーザーはビデオをアップロードします->サーバー側はビデオを受信し、ffmpegを使用してビデオ形式をflvに変換します->ユーザーはサイトで他のことを続けます。ここで、ユーザーがビデオがflvに変換されるのを待たずに他のことを実行できるように、変換作業を行うための別のスレッドを確立したいと思います(ffmpegを使用してビデオ形式をflvに変換します)。でも方法がわからない!
6 に答える
PHPはスレッドをサポートしていません。これを行うには、cronスクリプトによって実行されるバックグラウンドタスクを使用する必要があります。
たとえば、ディスク上のファイル名、ステータス(保留中、変換中、準備完了)などを含む、処理するジョブを含むテーブルを作成し、スクリプトで保留中のすべてのジョブを取得して、ステータスを変換に変更することができます。ファイルを変換してから、ステータスを準備完了に変更します。このようにして、ユーザーに情報を提示することもできます。同時に複数のファイルを変換する場合は、複数のスクリプトを実行できます。
変換が必要なビデオのキューを作成し、cron
たとえばジョブを使用してビデオを1つずつ変換します。このキューは、メッセージキューやデータベースなどに保存できます。
ID
データベースを使用するとStartDatetime
、列、、、、、を含むテーブルを作成しEndDatetime
、ビデオのアップロード時にそれらを適切に設定できますFilename
。一部のユーザーが自分の動画のステータスをリクエストすると、データベースでステータスを検索するだけです。たとえば、1 =追加、2 =現在処理中、3 =完了、4=エラーです。Status
Owner
これで、cronジョブがすべてのアイテムの処理を1つずつ開始します。ステータスは1です。処理時に2に更新し、その後適切に3または4に更新します。
アップロードされたビデオの処理をすぐに開始するすべてのfork/exec / run-on-backgroundのようなソリューションによって、すべてのユーザーがサーバーをチョークできるようになります。複数のユーザーが同時に大きなビデオの処理を開始した場合はどうなりますか?個別のプロセスを制御することはできず、すべてのプロセスが同時に実行されているため、サーバーの速度が大幅に低下する可能性があります。
1つのプロセス(最初からcron
)を使用してアイテムを順番に処理することにより、使用されているリソースをより適切に管理できます。
ジョブサーバーのジョブのように見えます。バックグラウンドタスクとして追加するだけです
PHPは、いかなる方法、形状、形式でもマルチスレッド化されていません。いくつかの方法でそれを偽造することができますが、それらは真の「スレッド」ではありません。
ignore_user_abort(TRUE)
ユーザーが切断した後もスクリプトを実行し続けることができます。exec()
バックグラウンドで実行できるシェルレベルで新しいプロセスを起動できますが、これは完全に独立したプロセスであり、追加の対策なしに親スクリプトから制御することはできません。pcntl_fork()
現在のスクリプトのクローンを作成し、処理を続行できますが、名目上は親スクリプトから独立しています。これには、pcntl
拡張機能が使用可能である必要があり、Webリクエストのコンテキストで使用するのは安全ではありません。
私は人々が通常これらの種類のタスクのためにGearmanに頼ると思います:http://php.net/manual/en/book.gearman.php
バックグラウンドプロセスとしてffmpegを生成できます。詳細な説明はこちらをご覧ください。
アップロードしたビデオファイルをどこかに保存してからffmpegを実行し、ファイルが作成されるまで「Processing file ..」と表示することをお勧めします(ただし、ffmpegを待つ必要はなく、ファイルが作成されているかどうかを確認してください)。
もう1つのオプションは、ファイルを/videosなどのディレクトリに配置することです。次に、/ videosフォルダーを監視し、新しいファイルを変換するcronジョブを作成します。
もちろん、より精巧でフェイルセーフな方法を考えることもできます。