2

ビデオファイルをディレクトリにアップロードするバッチフラッシュアップロードスクリプトがあります。単純。アップロードが完了すると、そのファイルの mysql レコードが作成され、キュー内の次のファイルに移動します。

その直前に、アップロードされた avi avi ファイルを iPod 互換の mp4 ファイルに変換するバックグラウンド プロセスを呼び出し、プレビュー サムを生成する必要があります。ご想像のとおり、少し時間がかかります...変換コードをファイルアップローダーに入れるだけです...しかし、すべてのファイルで10〜20分間ハングアップします。あなたは管理者専用の機能です)。

そのため、ファイルを変換している間に、バックグラウンドで変換プロセスをフォークし、次のアップロードに移動する必要があります。

このようなものでうまくいくでしょうか、それとも実際に php fork 関数を使用する必要がありますか?

exec("/usr/bin/php ./convert.php?id=123 > /dev/null 2>&1 &");
4

3 に答える 3

1

exec()のphpマニュアルページには次のように書かれています。

プログラムがこの関数で開始された場合、プログラムがバックグラウンドで実行を継続するには、プログラムの出力をファイルまたは別の出力ストリームにリダイレクトする必要があります。そうしないと、プログラムの実行が終了するまでPHPがハングします。

だから、はい、あなたのexec呼び出しはトリックを行います。

于 2009-10-08T21:26:25.820 に答える
1

これをアーキテクチャ的に実装する最良の方法は、PHPフロントエンドが変換するバックエンドファイルでデーモンにフィードするワークキューです。PHPを作業から切り離すと、UIは常に応答性を維持します。

私は長い間PHPを作成していませんが、開始されたプロセスはすべて最大タイムアウトルールに該当し、Webサーバーで実行されることを理解しています。あなたはそれが事実であることを望まない。確かに、追加のプロセスを開始できるWebリクエストは必要ありません。

Webサーバーの外部で実行され、アップロードされたファイルがないかフォルダーを監視する単純なデーモンを作成します。Webフロントエンドはそれらをそこにダンプし、デーモンは、コアの数まで、変換ごとにスレッドを生成します。アーキテクチャ上、これは賢明な選択です。

この質問に対する私の答えも参照してください。これも関連性があります。

于 2009-10-08T21:27:16.020 に答える
0

それはトリックを行いますが、それは手に負えないアイデアのようです。起動するだけで振り返らない場合は、問題がすぐに発生する可能性があります。

数分ごとに実行され、まだキューにあるものをすべてポーリングするスクリプトをスケジュールするのはどうですか。cronにアクセスできますか?

于 2009-10-08T21:29:06.907 に答える