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

angryTom
リリース: 2023-04-07 16:14:02
転載
2030 人が閲覧しました

最近、私は非同期 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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート