2

Process コンポーネントを使用して Symfony2 でバックグラウンド プロセスを作成し、次のようにバックグラウンドで実行したいと考えています。

$process = new Process('php myfile.php --option1 --option2');
$process->start();

ここで実行したいスクリプトは無期限に (while (true)またはそのようなもので) 実行され、コンソール コマンドまたはコントローラーから強制終了できるはずです。

問題は、作成されたものとは異なるコンテキストから Symfony のそのようなプロセスに (たとえばコントローラーから) アクセスするにはどうすればよいかということです。つまり、元のProcessインスタンスなしで? ルートへのリクエストcreate_processがプロセスを開始し、リクエストがkill_processそれを強制終了するとします。それは可能ですか?

私が考えることができる 1 つの方法は、プロセス オブジェクトをシリアル化してデータベースに格納することですが、このソリューションには多くの問題があるようです。

4

2 に答える 2

0

これを行うべきではありません。

PHP はステートレスであり、各リクエストは完全に一意です。

Symfony プロセスが内部でどのように機能するかはわかりませんが、私の知る限りexec()passthru()などを介して実行されたコマンドを強制終了する方法はありません。

このセクションを読んで、それが役立つかどうかを調べることができます: http://symfony.com/doc/current/components/process.html#process-pid

そうでない場合でも、プロセスの開始時に現在のタイムスタンプ (例: 1422971460) を取得し、「kill_1422971460」というファイルの存在を定期的に確認し、存在する場合はすぐに削除してプロセスを終了できます。

ただし、PHP はこのようなプロセス用に設計されていないため、この種のプロセスには別のプログラミング言語を使用することをお勧めします。max_execution_timeまた、apache スレッドと fcgi スレッドの間でヒットまたはタイムアウトが発生し、最終的にプロセスが強制終了される可能性があります。信頼性が低く、役に立ちません。

于 2015-02-03T13:53:18.847 に答える
0

DaemonizableCommandBundle を使用して、次のようなことを行いました。

EndlessCommandループ内で何かを実行し、いつでも終了できるコマンドを拡張して作成できるクラスがあります。 反復を正常に終了しようとします。

于 2015-02-03T13:55:06.557 に答える