搜尋
首頁php框架Swooleswoole為何從入門到放棄

swoole為何從入門到放棄

Dec 09, 2020 pm 05:37 PM
swoole

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 id="Hello-Swoole-param">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。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具