PHP プロセス全体で非同期呼び出しを行うために非常に小さなライブラリに取り組んでおり、オブジェクト (および配列) の参照に関して奇妙な動作が発生しています。オブジェクトまたは配列の参照に関係なく同じ問題が発生します)。最終結果は、オブジェクトと配列が一時的に空に見えることであり、私はこれがなぜ起こるのかを見つけようとしています.
次の画像は、親プロセスから 3 つの子を生成するスクリプトのトレースを示しています。すべての出力は親プロセスからのものです (子プロセスから端末に漏れることはありません)。親プロセスは子プロセスに一連のリクエストを送信し、一対の FIFO パイプを介してレスポンスを受け取ります。
- 青の行は、親が正常に応答を送受信した場所を示します。
- 赤い行は、親が応答を正常に送受信した場所を示しますが、応答を受信すると、RPC の表現を含む親のオブジェクトが不思議なことに「空」であるため、その RPC 応答に関連付ける必要があるアクションを実行できません。参照できないため呼び出されません。
- 金色の行は、各成功または失敗の前に表示され、応答を待機しているすべての RPC を保持するオブジェクトの状態を示します。行には、オブジェクト ID (オブジェクトの var_dump をスクレイピングしたもの) とそれが持つキー (子からの応答を待機している各 RPC の ID) が含まれます。
問題は次のように示されます。
緑色のリングのそれぞれで、同一のオブジェクトを参照していることがわかります。これは、PHP によって提供される内部 ID 参照です。緑色の輪が付いた最初の行では、オブジェクトには必要なすべてのプロパティがあります。
赤いリングのそれぞれには、「失敗」した RPC の ID があります。これは、2 行目の緑のリングで、オブジェクトが不思議なことに空になっているためです。
プロセスの後半、緑の輪のある 3 行目で、オブジェクトは魔法のようにすべてのプロパティを元に戻します。
ノート:
- これは完全にランダムに発生します。
- これは、配列を使用する場合も同じように発生します (私は元々、オブジェクトの代わりに配列を使用していましたが、この動作を回避するためにオブジェクトを試してみました)。