たとえば、ログデータを記録したい場合、コードが非同期に実行された直後にそれを保存する必要がなく、コールバック処理も必要ありません。データをメッセージキューに送信しますが、これにも時間がかかります。データを誰に送信するかについては、データベースに入れるのにどれだけ時間がかかるかは気にしません。 . たとえば、
echo 1;
log(data);
echo 2;
log関数をバックグラウンドで実行したいのですが、どれくらい時間がかかるかについては、気にしません。私にとっては、数ミリ秒で完了するように見えます。
たとえば、ログデータを記録したい場合、コードが非同期に実行された直後にそれを保存する必要がなく、コールバック処理も必要ありません。データをメッセージキューに送信しますが、これにも時間がかかります。データを誰に送信するかについては、データベースに入れるのにどれだけ時間がかかるかは気にしません。 . たとえば、
echo 1;
log(data);
echo 2;
log関数をバックグラウンドで実行したいのですが、どれくらい時間がかかるかについては、気にしません。私にとっては、数ミリ秒で完了するように見えます。
メッセージキューへの送信 VS ミリ秒レベル >>> 矛盾はどこにありますか?
Redis を使用してキューを作成できます。Redis 操作は 1 秒あたり数万回の読み取りと書き込みを行うだけで済み、所要時間はミリ秒未満です。
したがって、キューを使用すると、あなたが言及したミリ秒レベルの要件を完全に満たすことができると思います。
さらに、非同期操作の実行にどのような手段を使用しても、時間のオーバーヘッドが常に発生します。これは避けられません。
リーリー
変数 $arg は、task.php の $argv[1] を通じて取得されるパラメータです。
timeout 60 は、task.php スクリプトの最大実行時間が 60 秒であることを意味します。必要ない場合は削除できます。
pclose(popen()) による非同期実装の本質は、ブロック コードを実行するプロセスを開くことです。
後で自動的に結果 (コールバック) を返す必要がない非同期シナリオに適しています。実行が完了しました
文字列パラメータ $arg は一重引用符で囲むことができ、これにより一部のスペースの影響を回避できますが、それでも問題があります。
文字列パラメータをファイルにシリアル化してから、ファイル パス パラメータを渡すのが最善です。スクリプト task.php 、
task.php が単独でファイルを読み取り、データをアンシリアライズおよびデシリアライズします。
ファイル名は一意である必要があります。たとえば、ユーザー ID またはプロセス PID にランダムな時間番号を加えたものにすることができます。
リーリー