ホームページ >バックエンド開発 >PHPチュートリアル >非同期プログラミング - php はどのようにしてコードを非同期に実行しますか?

非同期プログラミング - php はどのようにしてコードを非同期に実行しますか?

WBOY
WBOYオリジナル
2016-08-08 09:06:531336ブラウズ

たとえば、ログデータを記録したい場合、コードが非同期に実行された直後にそれを保存する必要がなく、コールバック処理も必要ありません。データをメッセージキューに送信しますが、これにも時間がかかります。データを誰に送信するかについては、データベースに入れるのにどれだけ時間がかかるかは気にしません。 . たとえば、
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 にランダムな時間番号を加えたものにすることができます。 リーリー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。