ホームページ  >  記事  >  バックエンド開発  >  PHP について知らないこと - PHP のイベント駆動型設計

PHP について知らないこと - PHP のイベント駆動型設計

angryTom
angryTom転載
2019-10-15 11:20:131955ブラウズ

最近、私は非同期 PHP の使用を必要とするプロジェクトに取り組んでいました。PHP ソース コードを調べていると、sysvsem、sysvshm、sysvmsg という 3 つの未使用モジュールを見つけました。調査した結果、多くのメリットが得られました。

PHP にはこのような関数ファミリーがあり、これは UNIX の V IPC 関数ファミリーのパッケージです。

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

これらには次のものが含まれます:

セマフォ

##共有メモリ

プロセス間メッセージング (IPC) )

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

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

1. ftok

int ftok ( string pathname, string proj )
//ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key

2.ticks

Ticks は PHP 4.0 からのものです。これは、PHP 3 の初めにのみ追加されました。これは、インタプリタが宣言コード セグメント内の 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. 次に例を使用して、Tick を組み合わせて 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 実行プロセスを追加します。

次に、Ticks を使用して、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 をイベント駆動型としてシミュレートする方法の概念は誰もがすでに持っているのではないでしょうか?心配しないでください。引き続き改善していきます。

3. セマフォ

誰もがセマフォの概念に精通しているはずです。セマフォを通じて、プロセス通信、競争などが実現できます。詳細には再度触れませんが、PHP で提供されるセマフォ関数のセットを簡単にリストします。

sem_acquire -- Acquire a semaphore
sem_get -- Get a semaphore id
sem_release -- Release a semaphore
sem_remove -- Remove a semaphore

具体的な情報については、PHP マニュアルを参照してください。

4. メモリ共有

PHP sysvshm は、sysvsem および sysvmsg と同じシリーズの sysvshm というメモリ共有ソリューションを提供しますが、ここでは使用せず、shmop シリーズを使用しました。関数を使用して、この例を TIcks

function memoryUsage(){
 printf("%s: %s<br/>", date("H:i:s", $now), 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 中国語 Web サイト をご覧ください。

以上がPHP について知らないこと - PHP のイベント駆動型設計の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はwww.laruence.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。