ボイラープレートコードなしで堅牢で安定したPHPマルチプロセスデーモンを作成します。コアデーモンクラスはメインループとイベントを処理し、必要な任意の周波数(PHPの制限内)で実行できます。オプションでバックグラウンドでデーモンプロセスを実行するために、単一のメソッドexecute実装するだけです。
タスクとワーカーを使用して、デーモンは、フォークされた子供の管理を心配して、バックグラウンドプロセスのメソッドをシームレスに呼び出すことができます。プラグインを使用すると、デーモン用の再利用可能で共有可能なコードを簡単に作成できます。詳細については、以下の機能セクションを参照してください。
明らかに、PHPで堅牢で安定した長期にわたるデーモンを書くことは、一般的に良い考えではありません。少なくともやるのは非常に難しいです。私は個人的にPHPでデーモンが必要でした。なぜなら、私は主要なバックエンドデーモンを必要とするSymfonyに組み込まれたWebサイトフレームワーク全体を持っていたからです。リソースまたは構成の複製を使用して、すべてのフロントエンド依存関係とエンティティを再利用できるようにしたかったのです。
このライブラリは、堅実なデーモンを作成できるようにできる限りのことを行いますが、ユーザーランドコードには、物事を安定させるために注意する必要があります。
ドキュメントについては、wikiを参照してください。
実行できる例については、例を参照してください。
Main Loopは、コアデーモンクラスによって維持されます。あなたがしなければならないのは、すべてのループサイクルと呼ばれる1つのメソッドexecuteを実装することです。ループ周波数は、秒で任意の分数値になります。 0に設定されている場合、 execute方法はできるだけ早く呼び出されます(ループが何らかのブロッキングコールを実行していない限り、つまりソケットを聞くなど)。タスクを使用すると、バックグラウンドプロセスのメソッドまたはコールバックを呼び出すことができます。バックグラウンドプロセスと親の間にコミュニケーションは行われません。タスクは、たとえば、電子メールの送信など、単純なものを対象としています。
ワーカーを使用すると、オブジェクト上の任意のメソッド、またはタスクのような単純なコールバックを呼び出すことができます。労働者は、労働者の方法で単純なreturnステートメントを介して親に値を返すことができます。労働者は自動的に維持され、複数の子供を同時に走らせることができます。これは透過的に処理されます。労働者がOSによって死亡または殺されたとしても、デーモンAPIは引き続きコードに結果(または例外)を返します。労働者の返品値は通常、 Promiseオブジェクトです。 thenような標準的な約束方法を使用してotherwise返品値に基づいて行動することができます。または、ワーカーにON_RETURNコールバックを登録することもできます。
労働者はメディエーターの設計パターンを使用し、メッセージのキューとデータに共有メモリを使用します。さまざまなIPCクラスを作成して、親と子供の間に代替コミュニケーション方法を提供することができます。 SHMの代わりにソケットを使用して別の選択を提供する2番目のIPCクラスに取り組むことができます。
Daemonには、コールバックを登録することで簡単にインターフェイスできるイベント(イベントを参照)がいくつかあります。一部のイベントには、デーモンの動作を変更する手段があります。ON_SIGNALコールバックを登録するだけです。コールバックは、キャッチされた信号を使用してSignalEventに渡されます。Pluginアーキテクチャを使用すると、デーモンに注入できる独自のプラグインを使用および作成できます。プラグインはゆっくりとロードできます。FileLock使用すると、ロックメカニズムを追加して、デーモンが一度に複数のインスタンスを実行するのを防ぐことができます。デーモンにプラグインを登録するだけで、残りは自動です。 ShmLockは似ていますが、共有メモリを使用してロックを取得します。Daemonには、 log 、 error 、 debug 3つの基本的なロギング方法があります。これらはすべて、ログファイルに書き込みます(構成されている場合)。ログファイルが回転、上書きまたは削除されている場合、デーモンはこれを自動的に検出し、新しいログファイルへの書き込みを継続します。 Daemonevent :: on_logイベントを使用すると、動作を変更するためにコールバックを登録できます。ユーザーコードは、LogTraitを使用して、ネイティブデーモンロギングをコードに簡単に追加できます。このライブラリの基礎は、GithubのShane HarterのPHP-Daemon Libraryに触発されました。残念ながら、彼のライブラリは放棄されました(または無期限の休みにあります)、PHP v5.3のために書かれており、名前の上場もパッケージ管理も自動ローダーもありませんでした(つまり:作曲家)。
私は、教育目的で彼の元のライブラリを分岐して変更する代わりに、まったく新しいライブラリを作成することを選択します。私は彼の方法論のいくつかにも同意しませんでした。いくつかの追加の依存関係が必要ですが、作曲家はこれを些細な問題にしています。
_このライブラリは完全に機能する状態にあります。私は、メモリの漏れやクラッシュで数ヶ月間走っている非常に複雑なデーモンを作成しました。もっとできる...