9

現在、利用可能なコンテンツから demenad で epub を生成しようとしています。残念ながら、epub のコンテンツが大量にある場合、http 要求が完了するまでにしばらく (場合によっては 10 分) かかります。これは理想的ではありません。

Safari と同様のアプローチに従いたい - epub を生成し、ドキュメントが利用可能になったらユーザーにメールを送信する

私の質問は、完了するまでに時間がかかる可能性のあるバックグラウンド タスク/スレッドを PHP で実行するための最良の方法は何ですか?

4

2 に答える 2

19

長時間実行される PHP プロセスには注意が必要です。たとえば、PHP はメモリ効率があまり高くないためです (例として、PHP のわずか 100 の int の配列は 15KB ものメモリを消費する可能性があります)。これは通常、99% のユース ケースで問題ありません。ほとんどの人は Web サイトに PHP を使用しているだけであり、これらのプロセスは数分の 1 秒で実行されるため、速度のためにメモリが犠牲になります。ただし、長時間実行されるプロセスの場合 (特にプロセスが多数ある場合)、これは最善の解決策ではない可能性があります。

また、PHP で exec/shell_exec のような関数を呼び出す場合は、ストリームとして内部的に実装されるため、細心の注意を払う必要があります (つまり、親プロセスは通常、データを返すためにストリームを待機する必要があるため、親プロセスでブロックが発生する可能性があります)。

タスクをバックグラウンドで実行するオプションの 1 つは、forkを使用することです。ただし、これらのタスクをよりクリーンに処理するには、gearman ( php 拡張機能も参照) やキュー ( amqpzmqなど)などの適切なジョブ マネージャーを使用することを強くお勧めします。どちらがあなたのユースケースにより適しているか、私はあなたに決めさせます.

于 2012-12-10T14:29:17.677 に答える
2

コマンドを実行できます

$command = 'nohup >/dev/null 2>&1 /your/background/script.php &'
于 2012-12-10T14:18:27.503 に答える