この記事では主に PHP のイベント駆動設計について紹介します。必要な方は参考にしてください。この記事では PHP のイベント駆動設計について例を交えて説明します。ご参考までに、詳細は次のとおりです。
最近、非同期 PHP の使用を必要とするプロジェクトに取り組んでいたとき、PHP のソース コードを調べていたところ、未使用のモジュールが 3 つありました。 、sysvsem、sysvshm、および sysvmsg について調べてみると、その利点は非常に大きいことが分かりました。
phpにはそのような関数ファミリーがあります。それらはUnixのv ipc関数ファミリーのパッケージです。
人によって使用されることはめったにありませんが、強力です。それらを賢く使用すると、半分の労力で 2 倍の結果を得ることができます。
それらには以下が含まれます:
共有メモリプロセス間メッセージング(ipc)
これらに基づいて、PHPをメッセージ駆動型システムにパッケージ化することは完全に可能です。
しかし、最初に、いくつかの重要な基本を紹介する必要があります:
1. ftokint ftok (string pathname, string proj)
ftok は、パス名 pathname とプロジェクト名 (必ず文字)、システム v ipc
2 を使用するために使用される整数キーに変換されます。ticksticks は php 4.0.3 以降でのみ php に追加されました。宣言コード スニペットで説明されています。毎回発生するイベントです。プロセッサは n 個の低レベルのステートメントを実行します。 nの値はdeclareのディレクティブ部分のticks=nで指定します。
function getstatus($arg){ print_r(connection_status()); debug_print_backtrace(); } reigster_tick_function("getstatus", true); declare(ticks=1){ for($i =1; $i<999; $i++){ echo "hello"; } } unregister_tick_function("getstatus");
これは基本的に:
function getstatus($arg){ print_r(connection_status()); debug_print_backtrace(); } reigster_tick_function("getstatus", true); declare(ticks=1){ for($i =1; $i<999; $i++){ echo "hello"; getstatus(true); } } unregister_tick_function("getstatus");
Message と同等です。ここで例を使用して、ティックを使用した PHP メッセージ通信を実装する方法を説明します。
$mesg_key = ftok(__file__, 'm'); $mesg_id = msg_get_queue($mesg_key, 0666); function fetchmessage($mesg_id){ if(!is_resource($mesg_id)){ print_r("mesg queue is not ready"); } if(msg_receive($mesg_id, 0, $mesg_type, 1024, $mesg, false, msg_ipc_nowait)){ print_r("process got a new incoming msg: $mesg "); } } register_tick_function("fetchmessage", $mesg_id); declare(ticks=2){ $i = 0; while(++$i < 100){ if($i%5 == 0){ msg_send($mesg_id, 1, "hi: now index is :". $i); } } } //msg_remove_queue($mesg_id);
この例では、まず ftok によって生成されたキーによって取得されたメッセージ キューに php 実行プロセスを追加します。
次に、ティックを通じて、2 つのステートメントごとにメッセージ キューをクエリします。
その後、メッセージ送信がシミュレートされます。
ブラウザでこのスクリプトにアクセスすると、結果は次のようになります:
process got a new incoming msg: s:19:"hi: now index is :5"; process got a new incoming msg: s:20:"hi: now index is :10"; process got a new incoming msg: s:20:"hi: now index is :15"; process got a new incoming msg: s:20:"hi: now index is :20"; process got a new incoming msg: s:20:"hi: now index is :25"; process got a new incoming msg: s:20:"hi: now index is :30"; process got a new incoming msg: s:20:"hi: now index is :35"; process got a new incoming msg: s:20:"hi: now index is :40"; process got a new incoming msg: s:20:"hi: now index is :45"; process got a new incoming msg: s:20:"hi: now index is :50"; process got a new incoming msg: s:20:"hi: now index is :55"; process got a new incoming msg: s:20:"hi: now index is :60"; process got a new incoming msg: s:20:"hi: now index is :65"; process got a new incoming msg: s:20:"hi: now index is :70"; process got a new incoming msg: s:20:"hi: now index is :75"; process got a new incoming msg: s:20:"hi: now index is :80"; process got a new incoming msg: s:20:"hi: now index is :85"; process got a new incoming msg: s:20:"hi: now index is :90"; process got a new incoming msg: s:20:"hi: now index is :95";
これを見れば、誰もがイベント駆動型として PHP をシミュレートする方法の概念をすでに持っていますか? 心配しないでください。引き続き改善していきます。
2. セマフォセマフォの概念は誰もがよく知っているはずです。セマフォを通じて、プロセス通信、競争などが実現できます。 詳しい説明は省略しますが、PHP で提供されているセマフォ関数のセットを簡単に列挙します
sem_acquire -- セマフォを取得しますsem_get -- セマフォ ID を取得しますsem_release -- セマフォを解放します
sem_remove -- セマフォを削除しますセマフォ
具体的な情報については、php マニュアルを参照してください。
php sysvshm は、sysvsem および sysvmsg と同じシリーズのメモリ共有ソリューションを提供しますが、ここでは使用しませんでした。shmop シリーズの関数と組み合わせて使用しました。 Nicks
function memoryusage(){ printf("%s: %s<br/>", date("h:i:s",time()), memory_get_usage()); //var_dump(debug_backtrace()); //var_dump(__function__); //debug_print_backtrace(); } register_tick_function("memoryusage"); declare(ticks=1){ $shm_key = ftok(__file__, 's'); $shm_id = shmop_open($shm_key, 'c', 0644, 100); } printf("size of shared memory is: %s<br/>", shmop_size($shm_id)); $shm_text = shmop_read($shm_id, 0, 100); eval($shm_text); if(!empty($share_array)){ var_dump($share_array); $share_array['id'] += 1; }else{ $share_array = array('id' => 1); } $out_put_str = "$share_array = " . var_export($share_array, true) .";"; $out_put_str = str_pad($out_put_str, 100, " ", str_pad_right); shmop_write($shm_id, $out_put_str, 0); ?>
この例を実行し、継続的に更新すると、インデックスが増加していることがわかります。
この shmop を使用するだけで、PHP スクリプト間でデータを共有する機能や、キャッシュ、カウントなどの機能を完了できます。
関連する推奨事項:
PHP イベントメカニズムの実装詳細な分析: PHP イベント駆動型の問題について_PHP チュートリアル以上がphpのイベント駆動型設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。