ホームページ  >  記事  >  PHPフレームワーク  >  なぜスウールは始めてから諦めてしまったのでしょうか?

なぜスウールは始めてから諦めてしまったのでしょうか?

coldplay.xixi
coldplay.xixi転載
2020-12-09 17:37:263631ブラウズ

swoole チュートリアル始めてから挫折するまでの理由を紹介

なぜスウールは始めてから諦めてしまったのでしょうか?

おすすめ (無料): swoole チュートリアル

1. swoole ソース パッケージのインストール

  1. swoole ソース コードをダウンロードします: git clone https://gitee.com/swoole/swoole.git
  2. phpize 経由 (php 拡張モジュールの拡張、php プラグイン モジュールの作成):

    • cd swoole
    • 実行: your /phpize/path
    • ./configure --with-php-config=your/php/path/bin/php-config
    • ## make && make install
  3. swoole.so の場所が表示されます

      私の場所は次のとおりです:
    • /opt/soft/php/lib/php/extensions/no-debug-non-zts-20170718/
  4. #php.ini の設定
  5. Add
      extension=swoole.so
  6. php -m
  7. コマンドを通じて、php 拡張モジュールを確認できます
  8. swoole が正常にインストールされ、php が swoole をサポートしていることを検出します。
    • cd your/swoole/path/examples/server
    • ##php echo.php
    • (プロセスがブロックされた場合は成功を意味します)
    • netstat -anp | grep 9501
    • (swoole によって開かれたポート番号を表示します)
2. ネットワーク通信エンジン

swoole を学ぶには、ドキュメントを読む必要があります。 swoole ドキュメント

1. swoole

tcp サーバー (tcp_server.php)

//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);

$serv->set([
    'worker_num' => 4, // worker进程数,cpu 1-4倍
    'max_request' => 100,
]);

/**
 * 监听连接进入事件
 * $fd 客户端连接服务端的唯一标识
 * $reactor_id 线程id
 */
$serv->on('connect', function ($serv, $fd, $reactor_id) {
    echo "Client: {$fd} - {$reactor_id} - Connect.\n";
});

//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
    $serv->send($fd, "Server: ".$data);
});

//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

//启动服务器
$serv->start();
tcp クライアント (tcp_client.php)
// 创建tcp客户端
$client = new swoole_client(SWOOLE_SOCK_TCP);

// 连接tcp服务端
if (!$client->connect("127.0.0.1", 9501)) {
    echo '连接失败';
    exit;
}

// php cli
fwrite(STDOUT, '请输入:');
$msg = trim(fgets(STDIN));

// 发送消息给tcp服务端
if (!$client->send($msg)) {
    echo '发送消息失败';
    exit;
}

// 接收
$result = $client->recv();
echo $result;
## を介して最も単純な TCP サービスを作成します。 #2. 拡張: php

匿名関数の 4 つのコールバック
  • $server->on('Request', function ($req, $resp) {
        echo "hello world";
    });
クラスの静的メソッド
  • class A
    {
        static function test($req, $resp)
        {
            echo "hello world";
        }
    }
    $server->on('Request', 'A::Test');
    $server->on('Request', array('A', 'Test'));
  • #関数
  • function my_onRequest($req, $resp)
    {
        echo "hello world";
    }
    $server->on('Request', 'my_onRequest');
    #オブジェクト メソッド
    #
class A
{
    function test($req, $resp)
    {
        echo "hello world";
    }
}

$object = new A();
$server->on('Request', array($object, 'test'));
  • ヒント: 開いたワーカー プロセスを表示:
  • ps aft | grep tcp_server.php
    3. UDP サーバーとクライアント ドキュメントに従って自分で作成することもできます
    4. http サービス
    // 监听所有地址和9501端口
    $http = new swoole_http_server('0.0.0.0', 9501);
    
    // 动静分离配置
    $http->set([
        // 开启静态请求
        'enable_static_handler' => true,
        // 静态资源目录
        'document_root' => '/opt/app/code1/',
    ]);
    
    $http->on('request', function ($request, $response) {
        // 获取get请求的参数
        $param = json_encode($request->get);
        // 设置cookie
        $response->cookie('name', 'ronaldo', time() + 1800);
        // 输出到页面
        $response->end("<h1>Hello Swoole - {$param}</h1>");
    });
    
    // 开启http服务
    $http->start();

    5. swoole

    websocket サーバー (websocket_server.php)

    // 监听所有地址和9502端口
    $server = new swoole_websocket_server('0.0.0.0', 9502);
    
    // 动静分离配置
    $server->set([
        // 开启静态请求
        'enable_static_handler' => true,
        // 静态资源目录
        'document_root' => '/opt/app/swoole/websocket',
    ]);
    $server->on('open', function ($server, $request) {
        echo "server:handshake success with fd - {$request->fd}\n";
    });
    
    $server->on('message', function ($server, $frame) {
        echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
        $server->push($frame->fd, "this is server");
    });
    
    $server->on('close', function ($server, $fd) {
        echo "client - {$fd} - close\n";
    });
    
    $server->start();

    を通じて WebSocket サービスを作成しますwebsocket クライアント (websockt_client.html)

    // 创建websocket实例
            var websocketURL = "ws://www.rona1do.top:9502";
            var websocket = new WebSocket(websocketURL);
    
            // 实例化对象的onopen属性
            websocket.onopen = function (ev) {
                websocket.send("hello-websocket");
                console.log("connect-swoole-success");
            }
    
            // 实例化对象的onmessage属性,接收服务端返回的数据
            websocket.onmessage = function (ev) {
                console.log("websockect-server-return-data:" + ev.data);
            }
    
            // close
            websocket.onclose = function (ev) {
                console.log("close");
            }

    6. オブジェクト指向を使用して Websocket サービス コードを最適化する
    class WebSocket {
        const HOST = '0.0.0.0';
        const PORT = 9502;
    
        private $ws = null;
    
        function __construct()
        {
            $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
            $this->ws->on('open', [$this, 'onOpen']);
            $this->ws->on('message', [$this, 'onMessage']);
            $this->ws->on('close', [$this, 'onClose']);
            $this->ws->start();
        }
    
        // 监听websocket连接事件
        function onOpen($server, $request) {
            echo "server: handshake success with fd{$request->fd}\n";
        }
    
        // 监听websocket消息接收事件
        function onMessage($server, $frame) {
            echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
            $server->push($frame->fd, "this is server");
        }
    
        // 监听客户端关闭事件
        function onClose($server, $fd) {
            echo "Client:{$fd} closes\n";
        }
    }
    7. スウールでのタスク 小規模なケース

    onTask:
    は task_worker プロセス内で呼び出されます。ワーカー プロセスは、swoole_server_task 関数を使用して、新しいタスクを task_worker プロセスに配信できます。現在の Task プロセスが onTask コールバック関数を呼び出すと、プロセスのステータスがビジーに切り替わり、新しいタスクを受信しなくなります。onTask 関数が戻ると、プロセスのステータスがアイドルに切り替わり、新しいタスクの受信を継続します。

    onFinish: ワーカー プロセスによって配信されたタスクが task_worker で完了すると、タスク プロセスは swoole_server->finish() メソッドを通じてタスクの処理結果をワーカー プロセスに送信します。 。 rree

    以上がなぜスウールは始めてから諦めてしまったのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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