首頁  >  文章  >  php框架  >  swoole為何從入門到放棄

swoole為何從入門到放棄

coldplay.xixi
coldplay.xixi轉載
2020-12-09 17:37:263493瀏覽

swoole教學介紹為何從入門到放棄

swoole為何從入門到放棄

#推薦(免費):swoole教學

    • #一、swoole的源碼包安裝
    • 下載swoole原始碼:
    • git clone https://gitee.com/swoole/swoole.git
    透過phpize(擴充php擴充模組,建立php外掛模組):
  1. cd swoole
    • 執行:your /phpize/path
  2. ./configure --with-php-config=your/php/path/bin/php-config

      ## make && make install
  3. 可以看到swoole.so的位置
  4. 我的位置是:
  5. /opt/ soft/php/lib/php/extensions/no-debug-non-zts-20170718/
    • 配置php.ini
    • #新增extension=swoole.so
    • 透過
    • php -m
    指令,可以看到php的擴充模組

偵測swoole安裝成功且php支援swoole

cd your/swoole/path/examples/server

php echo.php
(如果進程被阻塞,則說明成功)

netstat -anp | grep 9501
    (查看swoole開啟的連接埠號碼)
    二、網路通訊引擎
  • 學習swoole需要去翻閱文檔, swoole文件
  • 1.透過swoole建立一個最簡單的tcp服務
    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;
  • 2.拓展:php的四個回呼
  • 匿名函數
$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'));
小技巧:
查看開啟的worker進程:  ###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服務端(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客戶端(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.swoole中的task小案例#########onTask:###在task_worker進程內被呼叫。 worker進程可以使用swoole_server_task函數向task_worker進程投遞新的任務。目前的Task進程在呼叫onTask回呼函數時會將進程狀態切換為忙碌,這時將不再接收新的Task,當onTask函數傳回時會將進程狀態切換為空閒然後繼續接收新的Task。 #########onFinish:###當worker進程投遞的任務在task_worker中完成時,task程序會透過swoole_server->finish()方法將任務處理的結果傳送給worker進程。 ###
class Websocket {

    const HOST = '0.0.0.0';
    const PORT = 9502;
    private $ws = null;

    public function __construct()
    {
        $this->ws = new swoole_websocket_server(self::HOST, self::PORT);
        $this->ws->set([
            'worker_num' => 2,
            'task_worker_num' => 2, // 要想使用task必须要指明
        ]);
        $this->ws->on('open', [$this, 'onOpen']);
        $this->ws->on('message', [$this, 'onMessage']);
        $this->ws->on('task', [$this, 'onTask']);
        $this->ws->on('finish', [$this, 'onFinish']);
        $this->ws->on('close', [$this, 'onClose']);
        $this->ws->start();
    }

    public function onOpen($server, $request)
    {
        echo "server:handshake success with fd:{$request->fd}\n";
    }

    public function onMessage($server, $frame)
    {
        echo "receive from {$frame->fd}:{$frame->data}\n";

        // 需要投递的任务数据
        $data = [
            'fd' => $frame->fd,
            'msg' => 'task',
        ];
        $server->task($data);

        $server->push($frame->fd, 'this is server');
    }

    // 处理投递的任务方法,非阻塞
    public function onTask($server, $task_id, $worker_id, $data)
    {
        print_r($data);
        // 模拟大量数据的操作
        sleep(10);
        return "task_finish";
    }
    
    // 投递任务处理完毕调用的方法
    public function onFinish($server, $task_id, $data)
    {
        echo "task_id:{$task_id}\n";
        echo "task finish success:{$data}\n";
    }
    
    public function onClose($server, $fd)
    {
        echo "Client:close";
    }
}

以上是swoole為何從入門到放棄的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除