単一プロセスシステムにおける非同期の重要性

4035 ワード

一般的にphpのプログラムは単一プロセスで、実行が終わったら次の文(ここではphpのpcntl_fork()シリーズの関数は使いません.私のやり方はそれよりずっといいです)を続けます.素質のあるお腹がすいている人たちのように(このご飯を食べないと切れるかもしれませんが、できるだけ早く食べたいと思っています)並んでご飯を買いに行くのと同じように、一つずつ買って次から買わなければなりません.一人で全部1角の小銭を持っていても、1角1角の数えが終わってから次のご飯を買う必要があります.実際に並んでご飯を買うのに2回遅れても大丈夫かもしれませんが、ユーザーに素早く応えるシステムでくださいでは、このような現象が発生すると面倒になり、完全なログイン操作が多くのステップに分かれているように、順番に実行すれば、1つの段階でカードが終わると、このユーザーはloadingボタンがずっと回っているのを見ることができます......この時、この問題を解決するメカニズムが必要です.
まずphpのプロセス間通信拡張、sysvmsgについて理解します.ここでこの拡張はlinux/uinuxでしか使用できません.他のプラットフォームでは無効です.私の環境はcentos 6です.3、この拡張機能をインストールするのは簡単です.
yum -y install php-process

もちろんphpがインストールされていることを前提としています.実行後、次のコマンドでインストールに成功したかどうかを確認します.
php -m | grep sysvmsg
#    sysvmsg       

#       
php -r 'var_dump(function_exists("msg_get_queue"))';
#    true       

もちろん、上記のコマンドはphpパスをシステム環境変数に追加する必要があります.
この拡張はプロセス間で通信できるが,以下に例を示す.
送信、send.php
#!/usr/bin/php
#        php  
<?php
$ip = msg_get_queue(12340);
//      
msg_send($ip,1,"Test a message",false,false,$err);
//         

受け入れるphp
#!/usr/bin/php
<?php
$ip = msg_get_queue(12340);
//      ,       ,       
while(msg_receive($ip,0,$msgtype,512,$data,false,null,$err)){
    echo "    : ".memory_get_usage()."
"; // echo " : $data
"; // }

実行プログラムにより,メッセージの送信とメッセージの受信はキューの標準FIFOに従うことがわかり,これらの特徴に基づいて非同期システムを設計することができる.
どのようにこれらの特性を使って、このように考えてみると、プログラムの実行時に多くの操作があるに違いありません.一部の操作は時々実行しなければなりませんが、一部の操作は遅延することができます.さらに、一部の操作はもともと重要ではありません.多くの時間がかかります.例えば、上陸ログを記録したり、ゲームの詳細を記録したりします.この時点でプログラムの実行を待つ必要はありません(などと問題になる可能性もありますが、特に重要でない場合は時間を無駄にします)、直接操作するものをキューに捨てて、バックグラウンドで単独でプロセスを開いて受信したメッセージを実行します.receive.phpのように、そこで待っていて、メッセージが来たときに実行して、ないときにブロックします.プログラムの実行時にプログラムをすぐに実行しないと時間が無駄になるという問題を成功裏に解決したわけではない.
具体的にどのように実現するかは、次から書きます.
send me~