ホームページ  >  記事  >  バックエンド開発  >  phpのイベント駆動型設計

phpのイベント駆動型設計

不言
不言オリジナル
2018-04-09 17:39:351759ブラウズ

この記事では主に PHP のイベント駆動設計について紹介します。必要な方は参考にしてください。この記事では PHP のイベント駆動設計について例を交えて説明します。ご参考までに、詳細は次のとおりです。

最近、非同期 PHP の使用を必要とするプロジェクトに取り組んでいたとき、PHP のソース コードを調べていたところ、未使用のモジュールが 3 つありました。 、sysvsem、sysvshm、および sysvmsg について調べてみると、その利点は非常に大きいことが分かりました。

phpにはそのような関数ファミリーがあります。それらはUnixのv ipc関数ファミリーのパッケージです。

人によって使用されることはめったにありませんが、強力です。それらを賢く使用すると、半分の労力で 2 倍の結果を得ることができます。


それらには以下が含まれます:

セマフォ

共有メモリプロセス間メッセージング(ipc)

これらに基づいて、PHPをメッセージ駆動型システムにパッケージ化することは完全に可能です。

しかし、最初に、いくつかの重要な基本を紹介する必要があります:

1. ftok

int ftok (string pathname, string proj)

ftok は、パス名 pathname とプロジェクト名 (必ず文字)、システム v ipc

2 を使用するために使用される整数キーに変換されます。ticks

ticks は 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__, &#39;m&#39;);
$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 マニュアルを参照してください。

3. メモリ共有

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__, &#39;s&#39;);
$shm_id = shmop_open($shm_key, &#39;c&#39;, 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[&#39;id&#39;] += 1;
}else{
 $share_array = array(&#39;id&#39; => 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 サイトの他の関連記事を参照してください。

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