0002 workermanの公式サイトのテスト例に対する分析

4022 ワード

これは0001の公式サイトの例で、導入部分は話さない.
uid = ++$global_uid;
}

//  , 
function handle_message($connection, $data)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send("user[{$connection->uid}] said: $data");
    }
}

//  , 
function handle_close($connection)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send("user[{$connection->uid}] logout");
    }
}

//  Worker 2347 
$text_worker = new Worker("text://0.0.0.0:2347");

//  1 , 
$text_worker->count = 1;

$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';

Worker::runAll();

まず次の段落を見てください.
//  Worker 2347 
$text_worker = new Worker("text://0.0.0.0:2347");

//  1 , 
$text_worker->count = 1;

$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';

Worker::runAll();

workermanは1つのポートをリスニングするので、ポートに対するリスニングクラス、すなわちWorkerを作成する必要がありますが、クラス自体は抽象的で、このクラスをインスタンス化する必要があります.$text_ワークオブジェクトがあるので
//  Worker 2347 
$text_worker = new Worker("text://0.0.0.0:2347");

次の操作では、Workerクラスには関心がなく、$text_にのみ関心があります.workerオブジェクト、$text_workerオブジェクトのメソッドはWorkerクラスから来ています.
workermanは同じプロセスでしかデータを転送できないため、テストを容易にするために1つのプロセスしか起動しません.
//  1 , 
$text_worker->count = 1;

workermanに対して配置してから起動して、この言葉は固定して、現在検討する意義は大きくありません
Worker::runAll();

これらは固定された部分だと言えますが、気にしなくてもいいです.では、次は、この3つの場所を重点的に見てみましょう.
$text_worker->onConnect = 'handle_connection';// 
$text_worker->onMessage = 'handle_message';// 
$text_worker->onClose = 'handle_close';// / 

注記:Workerのインスタンス化オブジェクト$text_を与えたことがわかります.worker、それではこのオブジェクトには必ず方法があります.彼は3つの方法があります.リンク、データの転送、接続を閉じ、それぞれonConnect、onMessage、onCloseに対応しています.onConnect,onMessage,onCloseはそれぞれ1つの方法handle_に対応していることがわかります.connection,handle_message,handle_closeのこれらの方法はtest 001で実現する.phpの中
function handle_connection($connection)
{
    global $text_worker, $global_uid;
    //  uid
    $connection->uid = ++$global_uid;
}

//  , 
function handle_message($connection, $data)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send("user[{$connection->uid}] said: $data");
    }
}

//  , 
function handle_close($connection)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send("user[{$connection->uid}] logout");
    }
}

接続部分だけでは、クライアントが接続されたばかりのときに記録操作が必要です.
$global_uid = 0;// 
function handle_connection($connection)
{
    global $text_worker, $global_uid;
    //  uid
    $connection->uid = ++$global_uid;
}

グローバルな$global_を初期化したことがわかりますuidは、各接続($connection)が接続されると、この接続にid番号が割り当てられます.このid番号は便利にするためにグローバル変数が1増加します.
クライアントがデータを送信したり、サービス側がデータを送信したりする場合、次の操作が必要です.つまり、初歩的な学習では、ビジネスロジックの一部は実際には「handle_message()」という方法で実現できます.
function handle_message($connection, $data)
{
    global $text_worker;
    foreach($text_worker->connections as $conn)
    {
        $conn->send("user[{$connection->uid}] said: $data");
    }
}

$text_workerサービス側には、接続されているすべてのクライアントの情報が含まれているので、$text_を巡回します.workerのconnections、つまり接続されたクライアントはsendメソッドで1つずつ送信すると、すべてのクライアントメッセージにブロードキャストでき、handle_Message($connection,$data)この中の$connectionはメッセージを送信するクライアントであり、$dataはクライアントから送信されるデータである
接続を閉じてしばらく見ないで、放送する例は多くなくて、ここまで、私達の1つの粗末なチャットのツールは分析して終わります