国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

swoole——從入門到放棄(一)

morgan / 3614人閱讀

摘要:進程可以使用函數向進程投遞新的任務。當前的進程在調用回調函數時會將進程狀態切換為忙碌,這時將不再接收新的,當函數返回時會將進程狀態切換為空閑然后繼續接收新的。當進程投遞的任務在中完成時,進程會通過方法將任務處理的結果發送給進程。

swoole——從入門到放棄(一) 一、swoole的源碼包安裝

下載swoole源碼:git clone https://gitee.com/swoole/swoole.git

通過phpize(擴展php擴展模塊,建立php外掛模塊):

cd swoole

執行:your/phpize/path

./configure --with-php-config=your/php/path/bin/php-config

make && make install

可以看到swoole.so的位置

我的位置是:/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.
";
});

//監聽數據接收事件
$serv->on("receive", function ($serv, $fd, $reactor_id, $data) {
    $serv->send($fd, "Server: ".$data);
});

//監聽連接關閉事件
$serv->on("close", function ($serv, $fd) {
    echo "Client: Close.
";
});

//啟動服務器
$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("

Hello Swoole - {$param}

"); }); // 開啟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}
";
});

$server->on("message", function ($server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
    $server->push($frame->fd, "this is server");
});

$server->on("close", function ($server, $fd) {
    echo "client - {$fd} - close
";
});

$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}
";
    }

    // 監聽websocket消息接收事件
    function onMessage($server, $frame) {
        echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}
";
        $server->push($frame->fd, "this is server");
    }

    // 監聽客戶端關閉事件
    function onClose($server, $fd) {
        echo "Client:{$fd} closes
";
    }
}

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}
";
    }

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

        // 需要投遞的任務數據
        $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}
";
        echo "task finish success:{$data}
";
    }
    
    public function onClose($server, $fd)
    {
        echo "Client:close";
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30762.html

相關文章

  • swoole——入門放棄(三)

    摘要:從入門到放棄三一進程子進程創建成功后要執行的函數重定向子進程的標準輸入和輸出。默認為阻塞讀取。是否創建管道,啟用后,此選項將忽略用戶參數,強制為。 swoole——從入門到放棄(三) 一、進程 swoole_process SwooleProcess swoole_process::__construct(callable $function, $redirect_stdin...

    王笑朝 評論0 收藏0
  • swoole——入門放棄(三)

    摘要:從入門到放棄三一進程子進程創建成功后要執行的函數重定向子進程的標準輸入和輸出。默認為阻塞讀取。是否創建管道,啟用后,此選項將忽略用戶參數,強制為。 swoole——從入門到放棄(三) 一、進程 swoole_process SwooleProcess swoole_process::__construct(callable $function, $redirect_stdin...

    rottengeek 評論0 收藏0
  • swoole——入門放棄(二)

    摘要:從入門到放棄二一異步毫秒定時器設置一個間隔時鐘定時器,與定時器不同的是定時器會持續觸發,直到調用清除。是一次性函數,執行完成后就會銷毀最大不超過使用定時器來刪除定時器。 swoole——從入門到放棄(二) 一、異步毫秒定時器 swoole_timer_tick:設置一個間隔時鐘定時器,與after定時器不同的是tick定時器會持續觸發,直到調用swoole_timer_clear清...

    awokezhou 評論0 收藏0
  • swoole——入門放棄(二)

    摘要:從入門到放棄二一異步毫秒定時器設置一個間隔時鐘定時器,與定時器不同的是定時器會持續觸發,直到調用清除。是一次性函數,執行完成后就會銷毀最大不超過使用定時器來刪除定時器。 swoole——從入門到放棄(二) 一、異步毫秒定時器 swoole_timer_tick:設置一個間隔時鐘定時器,與after定時器不同的是tick定時器會持續觸發,直到調用swoole_timer_clear清...

    tinyq 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<