ホームページ  >  記事  >  PHPフレームワーク  >  swooleを非同期で呼び出す方法

swooleを非同期で呼び出す方法

藏色散人
藏色散人オリジナル
2020-04-09 10:12:252828ブラウズ

swooleを非同期で呼び出す方法

swoole を非同期的に呼び出すにはどうすればよいですか?

Swoole での非同期の使用

テスト ケース:

ws_server.php を書き換える

$this->ws->set(
    [
        'worker_num' => 2,
        'task_worker_num' => 2,
    ]
);
 
$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']);
 
public function onOpen($ws, $request) {
    var_dump($request->fd);
}
 
public function onMessage($ws, $frame) {
    echo "ser-push-message:{$frame->data}\n";
    $data = [
        'task' => 1,
        'fd' => $frame->fd,
    ];
    $ws->task($data);
    $ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s"));
}
 
public function onTask($serv, $taskId, $workerId, $data) {
    print_r($data);
    // 耗时场景 10s
    sleep(10);
    return "on task finish"; // 告诉worker   
}
 
 
public function onFinish($serv, $taskId, $data) {
    echo "taskId:{$taskId}\n";
    echo "finish-data-sucess:{$data}\n";
}

クライアント (ws_client.html) が情報を送信し、サーバーの onMessage が設定データを受け取って実行し、onTask を呼び出します。onTask で 3 秒間データを出力した後、onFinish にデータが返されます。データを取得して出力します。

ユーザー ページ:

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<h1>chuangxiang--测试</h1>
<script>
var wsUrl = "ws://192.168.0.103:8812";
 
var websocket = new WebSocket(wsUrl);
 
//实例对象的onopen属性
websocket.onopen = function(evt) {
    websocket.send("Hello chaungxiang");//输出到服务器端,即发送信息
    console.log("connected-swoole-success");//输出在页面
}
 
//实例化 onmessage
websocket.onmessage = function(evt) {
    console.log("ws-server-return-data:"+evt.data);
}
 
//实例化onclose
websocket.onclose = function(evt) {
    console.log("close");
}
 
//实例化onerror
websocket.onerror =function(evt,e) {
    console.log("error:"+evt.data);
}
</script>
</body>
</html>

ブラウザ: (クライアント)

swooleを非同期で呼び出す方法

サーバー:

swooleを非同期で呼び出す方法

データの最初の行はサーバーによって出力され、最初に onOpen() で接続が確立され、次にクライアント (ws_client.html) が接続し、 js コードを介して接続します。データを送信します。データを送信する前に 2 行目を印刷します。データをサーバーに送信した後、onMessage() を実行します。データを再度出力してタスクを作成し、onTask() を呼び出します。データを再度出力してデータを返します。 to onFinish();

サーバーはサーバーに直接出力し、クライアントはプッシュや送信などを通じてそれをサーバーに送信する必要があります。

クライアントconsole.log を通じてデータをページに出力します

非同期マニフェスト

public function onMessage($ws, $frame) {
    echo "ser-push-message:{$frame->data}\n";
    $data = [
        &#39;task&#39; => 1,
        &#39;fd&#39; => $frame->fd,
    ];
    $ws->task($data);
    $ws->push($frame->fd, "server-push:".date("Y-m-d H:i:s"));
}

このコードでタスクが作成された後、タスクは待機しません。タスクはプッシュする前に実行されますが、同時に続行されます。クライアントがデータを印刷して送信した後、クライアントによって印刷されたデータと onMessage の出力の間の間隔は非常に短く、ontask タスクのスリープの影響を受けません。

以上がswooleを非同期で呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。