22

バックグラウンド プロセスを作成したいのですが、これらは通常、C などで記述されていると言われています。私は最近、PHP を使用してデーモンを作成できることを知りました。この方法で PHP を使用する必要がある場合は、アドバイスを得たいと思っていました。

デーモンに対する私の要件は次のとおりです。

  • 行が MySQL データベース テーブルに追加されたかどうかを継続的に確認する
  • データベースから取得したものに対してFFmpegコマンドを実行します
  • 出力を MySQL テーブルに挿入する

この決定を下すために他に何を提供できるかわかりません。追加するために、私は以前にCをやったことがありません。Java と PHP、および基本的な bash スクリプトのみ。

それほどパフォーマンスの違いはありますか?

私の無知を許してください、私は学んでいます!:)

皆さんありがとう

4

17 に答える 17

29

他の人が指摘しているように、さまざまなバージョンの PHP にはガベージ コレクターに関する問題があります。もちろん、お使いのバージョンにそのような問題がないことがわかっている場合は、その問題を解消できます。要点は、デーモンを作成して valgrind を介して実行し、インストールされた PHP が特定のマシンでリークしているかどうかを確認するまで (確かに) わからないということです。その一方で、Zend が修正済みと考えているものがまだバグがある可能性があることを発見するためだけにそれを作成したり、PHP のわずかに古いバージョンや何らかの拡張機能を扱っている可能性があります。イッキー。

もう 1 つの問題は、ややバグのある信号です。私の経験では、特にシグナルがマージされずにキューに入れられた場合、シグナル ハンドラーは PHP で常に正しく入力されるとは限りません。SIGINT/SIGUSR1/SIGUSR2/SIGHUP を処理する必要があるだけであれば、それは問題にならないかもしれません。

だから、私は提案します:

デーモンが単純な場合は、PHP を使用してください。かなり複雑になったり、大量のメモリを割り当てたりするように見える場合は、PHP でプロトタイピングした後に C で記述することを検討してください。

私はかなり頑固な C 人です。ただし、PHP を使用して手早く何かを打ち出すことに問題はないと思います (説明したケースを超えて)。また、PHP を使用して、後で C で書き直される可能性があるものや、書き直されない可能性のあるもののプロトタイプを作成することにも問題はないと思います。その場合、「1 回限り」の場合、確実にはるかに速く完了します。

于 2009-03-15T13:20:47.223 に答える
16

デーモンでデータベースをポーリングするのではなく、cron ジョブでこのタスクを実行する傾向があります。

あなたのFFmpegコマンドがそれを行うのに時間がかかる可能性がありますよね?その場合、データベースを常にポーリングする必要は本当にあるのでしょうか? 毎分 (または 5 分、10 分、または 20 分ごと) 実行される cronjob は、同じことを達成するためのより簡単な方法ではないでしょうか?

于 2009-03-14T23:35:18.877 に答える
7

PHP は、他の一般的なスクリプト言語のどれよりも、この種のことに関して優れているわけでも劣っているわけでもありません。この種の作業を行うために必要なすべてのシステム コールとライブラリ ユーティリティに完全にアクセスできます。スクリプト作成に PHP を使用することに慣れている場合は、php が自動的に機能します。

唯一の欠点は、php が、ほぼすべての UNIX にインストールされている perl や python ほどユビキタスではないことです。PHP は、動的な Web コンテンツを提供する予定のシステムでのみ見つかります。Php インタープリターが大きすぎたり、インストールするのにコストがかかるというわけではありませんが、プログラムを多くのシステムに適用することが最大の関心事である場合、それはわずかなハードルになる可能性があります。

于 2009-03-14T23:35:32.153 に答える
6

私は反対で、phpデーモンを試すことをお勧めします。どうやらあなたが一番よく知っている言語です。いずれにせよ、おそらくタイマーを組み込むので、データベースでクエリの頻度を複製できます。クエリを素朴にループしない限り、ペナルティは実際にはありません。

頻繁に実行されない場合は、代わりにcronからphpを実行して、コードでキューを空にしてから終了することもできます。

しかし、最初の概算として、あなたが最もよく知っていることに固執することを恐れないでください。

トリガーを使用しないようにしてください。それらは不必要な結合を課し、テストやデバッグをするのは面白くありません。

于 2009-03-15T00:45:33.530 に答える
4

PHP スクリプトを適切にデーモン化する際の問題の 1 つは、ファイル記述子をデタッチするために必要な dup() または dup2() システムコールへのインターフェイスが PHP にないことです。

于 2009-03-16T21:17:00.783 に答える
3

ほぼ即時のアクションが必要ない場合、cron ジョブはおそらく問題なく機能します。

キューイングデーモン「beanstalkd」に基づいて構築したシステムをライブにしようとしています。(この場合は PHP) Web ページ呼び出しからさまざまな小さなメッセージをデーモンに送信すると、PHP スクリプトがそれらをキューから取得し、画像のサイズ変更やデータベースのチェックなどのさまざまなタスクを実行します (多くの場合、Memcache 経由で情報を返します)。を拠点とする店舗)。

実行時間の長いプロセスを避けるために、スクリプトから返された値 ("exit(1);") に応じて、実行される (たとえば) 50 タスクごとにスクリプトを再起動する BASH スクリプトでラップしました。 . 計画したために再起動している場合は、すぐに再起動します。他の終了値 (デフォルトは 0 であるため、使用しません) では、再起動する前に数秒一時停止します。

于 2009-03-15T13:00:04.777 に答える
2

賢明に決定された周期性を持つ cron ジョブとして実行される PHP スクリプトは、ジョブを実行でき、製品の安定性は確実に達成可能です。同時 FFMpeg インスタンスの数を制限し、完全なアプリケーション ロギングと例外処理を確実に行いたい場合があります。Java で継続的に実行されるポーリング プロセスと、10 分ごとに cron 化された PHP スクリプトを実装しましたが、どちらもうまく機能します。

于 2009-03-15T12:15:58.953 に答える
1

Kent Fredric、tokenmacguy、Domsterの回答を組み合わせると、何か便利なものが得られます。

phpは実行時間が長い場合はおそらく適切ではないため、すべての実行サイクルを短くし、OSがメモリリークのクリーンアップを確実に処理するようにします。PHPスクリプトを開始するためのツールとして、cronは優れたツールになる可能性があります。そして、そのようにすれば、言語間で大きな違いはありません。

しかし、問題はまだ残っています。phpは、通常のデーモンとして長時間(数年)実行することもできますか?それとも、さまざまなメモリリークがすべてのRAMを使い果たして、システムを強制終了しますか?

/ヨハン

于 2009-03-15T00:19:27.397 に答える
1

If you do decided to go down the daemon route, there is a great PEAR module called System_Daemon which I've recently used successfully on a PHP v5.3.0 installation. It is documented on the authors blog: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php

If you have PEAR installed, you can install this module using:

pear install -f System_Daemon

You will also need to create a initialisation script: /etc/init.d/<your_daemon_name>

Then you can:

  • Start Daemon: /etc/init.d/projNotifMailDaemon start
  • Stop Daemon: /etc/init.d/projNotifMailDaemon stop

Logs are kept at: /var/log/<your_daemon_name>.log

于 2009-11-12T08:05:02.593 に答える
1

あなたが説明したことについては、デーモンを使用します。新しいタスクがないときにデータベースを攻撃しないように、ポーリング ループにスリープを設定してください。cronjob は、次の実行をトリガーする特定のイベントがないワークフロー/レポート タイプのジョブに適しています。

前述のように、PHP にはメモリ管理に関するいくつかの問題があります。長時間実行されるスクリプトでは、時間の経過とともにメモリ リークが蓄積されるため、コードをテストしてメモリ リークを確認する必要があります。PHP には実際のガベージ コレクションはありません。参照カウントに依存しているため、循環参照によってリークが発生します。これを知っていれば、それを回避するようにコーディングできます。

于 2009-03-15T12:52:29.490 に答える
1

デーモンの代わりにシステムコマンド (つまり FFmpeg)を実行するmysqlトリガーを作成することを検討してください。多少の遅延が問題にならない場合は、数分ごとに実行される何かを cron に入れて確認することもできます。オプションである場合、Cronが私の選択です。

あなたの質問に答えるために、phpはデーモンとして実行しても問題ありません。C で行う必要はありません。

于 2009-03-14T23:36:44.117 に答える
1

その場合、メモリリークに注意してください。これによると、PHP 5.2 にはガベージ コレクターにいくつかの問題があります(5.3 で修正済み)。おそらく、cron を使用するほうがよいため、スクリプトは実行のたびにクリーンに開始されます。

于 2009-03-15T01:34:31.523 に答える
0

cronジョブと少しのbashスクリプトは、そのサウンドによって必要なすべてのものでなければなりません。次のようなことができます。

$file=`mysqlquery -h server < "select file from table;"`
ffmpeg $file -fps 50 output.a etc.

したがって、bashは、PHPを使用するよりも、IMHOの記述、移植、および保守が容易です。

于 2009-03-15T00:44:00.053 に答える
0

私はそれをお勧めしません。PHP は長時間実行するようには設計されていません。主に短命のページで設計されています。

私の経験では、PHP はいくつかの大規模なタスクでメモリ リークの問題が発生する可能性があります。

于 2009-03-14T23:34:41.560 に答える
-2

クローンジョブ?はい。

永遠に走るデーモン?いいえ。

PHP にはガベージ コレクタがありません (または、少なくとも前回確認したときはありませんでした)。したがって、循環参照を作成した場合、少なくともメイン スクリプトの実行が終了するまでは、クリーンアップされることはありません。デーモン プロセスでは、これはほぼありません。

彼らが新しいバージョンで GC を追加した場合は、そうすることができます。

于 2009-03-15T08:11:24.113 に答える
-5

頑張れ。私も一度やらなければなりませんでした。他の人が言ったように、それは理想的ではありませんが、それは成し遂げられるでしょう。Windowsを使っていますよね?良い。

たまにしか実行する必要がない場合(1時間に1回など)。Firefoxへの新しいショートカットを作成し、関連する場所に配置します。ショートカットのプロパティを開き、[ターゲット]を次のように変更します。

"C:\Program Files\Mozilla Firefox\firefox.exe" http://localhost/path/to/script.php

[コントロールパネル]>[スケジュールされたタスク]に移動します。新しいスケジュールされたタスクをショートカットにポイントします。

常時または疑似常時実行する必要がある場合は、スクリプトに少しスパイスを加える必要があります。

スクリプトを開始する

set_time_limit(0);
ob_implicit_flush(true);

スクリプトがループを使用する場合(whileなど)、バッファをクリアする必要があります。

$i=0;
while($i<sizeof($my_array)){
     //do stuff
     flush();           
     ob_clean();
     sleep(17);
     $i++;
}
于 2009-03-16T21:02:45.950 に答える