在 laradock 環(huán)境中使用 laravel-swoole 的 websocket

之前寫(xiě)了一篇 在 laradock 環(huán)境中使用 laravel-swoole 加速你的 laravel 應(yīng)用 的博客,算是敲開(kāi)了 laravel-swoole 的大門(mén),今天就繼續(xù)研究下期中的 websocket 功能。

安裝 laravel-swoole

這里就不寫(xiě)了,參考上篇。

配置 socket

編輯 laravel env 文件,寫(xiě)入如下一行:

SWOOLE_HTTP_WEBSOCKET=true

然后執(zhí)行 php artisan swoole:http infos 查看狀態(tài)

+-----------------+-----------------------------------------------------+
| Name            | Value                                               |
+-----------------+-----------------------------------------------------+
| PHP Version     | 7.2.21-1+ubuntu16.04.1+deb.sury.org+1               |
| Swoole Version  | 4.4.4                                               |
| Laravel Version | 5.8.33                                              |
| Listen IP       | workspace                                           |
| Listen Port     | 1215                                                |
| Server Status   | Online                                              |
| Reactor Num     | 2                                                   |
| Worker Num      | 2                                                   |
| Task Worker Num | 2                                                   |
| Websocket Mode  | On                                                  |
| Master PID      | 326                                                 |
| Manager PID     | 327                                                 |
| Log Path        | /var/www/laravel-learn/storage/logs/swoole_http.log |
+-----------------+-----------------------------------------------------+

可以看到 Websocket Mode 一項(xiàng)已經(jīng)打開(kāi)了。

編輯 socket 路由

routes/websocket.php 中:

Websocket::on('connect', function ($websocket, Request $request) {
    // called while socket on connect
    $websocket->emit('message', 'welcome');
});

Websocket::on('disconnect', function ($websocket) {
    // called while socket on disconnect
    $websocket->emit('message', 'server is gone, bye~');
});

Websocket::on('example', function ($websocket, $data) {
    $websocket->emit('message', $data);
});

此文件修改后需要重啟 swoole:http。

前端連接 socket

因?yàn)?laravel-swoole 使用的是 Socket.io,所以這里也采用這個(gè)。

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
<script type="text/javascript">
    var socket = io('http://study.test:8080/', {transports: ['websocket'], reconnection: true});

    socket.on('connect', function () {
        socket.emit('example', 'hi');

        socket.on('disconnect', function () {
            console.log('disconnect');
        });

        socket.on('message', function (msg) {
            console.log(msg)
        });
    });
</script>

配置 nginx

如果你用的 swoole 版本為 4.4.4,那么還需要對(duì)上篇文章中的 nginx 配置做個(gè)小修改,即添加一行:

 proxy_http_version 1.1;

完整配置就不貼了,把這一行加在 proxy_pass http://swoole-http$suffix; 這一行前后都行。

如果沒(méi)有這一行的話,而且怎么也沒(méi)反應(yīng)的話,記得去 log 中找具體報(bào)錯(cuò)。

emmm,文檔沒(méi)寫(xiě),在 issue 里扒出來(lái)的……

演示
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容