phpはイベント駆動に基づくネットワークプログラミングをどのように実現するか

2002 ワード

phpイベント駆動ベースのネットワークプログラミングをどのように実現するか
シーン
  • クライアントがサービス側にデータを送信すると、サービス側は同じ情報を返す.
  • は接続
  • を保持する.
    次のすべてのコードが単純な小さなdemo生産環境でのみ使用されるために、コードの厳密性を考慮する必要があることを示します.
    例1
    単純にデータを受け入れて返す
    ");
    ??>
    $ telnet 0.0.0.0 8000
    Trying 0.0.0.0...
    Connected to 0.0.0.0.
    Escape character is '^]'.
    hello //     
    hello //         
    
    Connection closed by foreign host.

    上記の例では、サービス側はクライアントデータを受信すると同じ情報を返し、接続が閉じられます.接続を維持できません.?の
    例2
    $socket = stream_socket_server("tcp://0.0.0.0:8000");
    while($conn = stream_socket_accept($socket)){
        while($info = fread($conn,1024)){
            fwrite($conn,$info);
        }
    }

    上記の例では、データを簡単に受け入れて実行を維持する欠点は、同時に1つの接続しか処理できないことです!!!
    例3
    $socket = stream_socket_server("tcp://0.0.0.0:8000");
    while($conn = stream_socket_accept($socket)){
        if(pcntl_fork()){
            while($info = fread($conn,1024)){
                fwrite($conn,$info);
            }
        }
    }

    ここでは実際にforkはn個のリクエストを処理するn個のサブプロセスを行う.しかしforkプロセスを使用する方法はよくなく、よくありません.もし10万個の接続があれば、10万個のプロセスが必要ではないでしょうか??oh,no!!
    例4
    libeventの実現に基づいて、完璧!!!
    0){
                fwrite($conn,$info);
            }
        });
        event_base_set($event,$base);
        event_add($event);
        $events[] = $event;
    });
    event_base_set($event,$base);
    event_add($event);
    event_base_loop($base);