安装
首先按照Swoole官网说明安装swoole扩展,推荐新手可以直接使用
pecl install swoole
#会安装最新的稳定版(截至本文发布最新版本是4.0.3版本)
或者源码安装:
git clone https://github.com/swoole/swoole-src.git && \
cd swoole-src && \
phpize && \
./configure && \
make && sudo make install
常见问题
问题一:
安装时提示gcc版本过低,可以安装最新的gcc,我安装了4.8.2的
问题二:
这时候安装还是报错,提示gcc版本过低,这时候我注释了 swoole_config.h中关于gcc的检测
问题三:
安装完成后,重启php-fpm发现报错:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
发现确实没有:GLIBCXX_3.4.18
ll /usr/lib64/libstdc++.so.6
发现连接的确实是个老版本:/usr/lib64/libstdc++.so.6.0.13
找一下最新安装的:find / -name libstdc++.so.6*
我们发现,gcc安装时把/libstdc++.so.6.0.18 安装到了/usr/local/lib64/libstdc++.so.6.0.18下,但并没有改变libstdc++.so.6的链接指向。
那么我们手动来更新软连接
cp /usr/local/lib64/libstdc++.so.6.0.18 /usr/lib64
rm -rf /usr/lib64/libstdc++.so.6
ln -s /usr/lib64/libstdc++.so.6.0.18 /usr/lib64/libstdc++.so.6
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
发现有:GLIBCXX_3.4.18了 再次重新启动,完成
安装完成后,你可能需要在你的php.ini中添加:
extension=swoole.so
因为我是 php5.6的版本,最新的swoole需要php7以上,只能先按照1.x版本了
进入oneinstack安装目录执行下面命令,有当前php版本的swoole安装选项:
./addons.sh
再执行下面:
composer require topthink/think-swoole
配置文件:config/swoole_server.php
启动:
可以支持直接启动一个Swoole server(需要2.0.9+版本)
php think swoole:server
配置文件:config/swoole_server.php
示例
使用自定义的服务类
namespace app\push;
use think\swoole\Server;
class Swoole extends Server
{
protected $host = '127.0.0.1';
protected $port = 9502;
protected $option = [
'worker_num' => 4,
'daemonize' => true,
'backlog' => 128
];
public function onReceive($server, $fd, $from_id, $data)
{
$server->send($fd, 'Swoole: ' . $data);
}
}
在swoole_server.php中增加配置参数
'swoole_class' => 'app\push\Swoole', // 自定义服务类名称
定义该参数后,其它配置参数均不再有效。
客户端测试代码:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>socket test</title>
<script>
function msg(txt){
var para=document.createElement("p");
var node=document.createTextNode(txt);
para.appendChild(node);
var element=document.getElementById("div");
element.appendChild(para);
}
// 打开一个 web socket
var ws = new WebSocket("ws://123.207.9.205:20000");
var div = document.getElementById("div");
ws.onopen = function()
{
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("send msg");
msg("send msg");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
msg("rev "+received_msg);
};
ws.onclose = function()
{
// 关闭 websocket
msg("close ");
};
</script>
</head>
<body>
<div id="div">
</div>
</body>
</html>
参考文档:
1.https://www.kancloud.cn/manual/thinkphp5_1/675277
2.https://www.swoole.com/