之前寫了一篇 在 laradock 環(huán)境中使用 laravel-swoole 加速你的 laravel 應(yīng)用 的博客,算是敲開了 laravel-swoole 的大門装处,今天就繼續(xù)研究下期中的 websocket 功能居砖。
安裝 laravel-swoole
這里就不寫了眷唉,參考上篇晃痴。
配置 socket
編輯 laravel env 文件缝彬,寫入如下一行:
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
一項已經(jīng)打開了妓局。
編輯 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
因為 laravel-swoole 使用的是 Socket.io
,所以這里也采用這個跟磨。
<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
间聊,那么還需要對上篇文章中的 nginx 配置做個小修改,即添加一行:
proxy_http_version 1.1;
完整配置就不貼了抵拘,把這一行加在 proxy_pass http://swoole-http$suffix;
這一行前后都行哎榴。
如果沒有這一行的話,而且怎么也沒反應(yīng)的話僵蛛,記得去 log 中找具體報錯尚蝌。
emmm,文檔沒寫充尉,在 issue 里扒出來的……