由于最近的项目运用到了swoole,那现在就简单的介绍下我的心得,希望大家多多指教;swoole主要用于PHP异步通信服务,多用于消息队列和游戏等,类似的还有wokerman也是做异步服务的。
1.安装Cygwin64
貌似在windows环境不支持但是支持MAC和linux环境,windows下需要安装模拟类似linux虚拟环境的软件Cygwin64 Terminal,安装连接请参考如下http://blog.csdn.net/u014207604/article/details/49926207 我在自己笔记本上安装成功(注意其他连接安装不正确,需要安装pcre-devel);
2.下载swoole源码并解压到Cygwin64安装目录的home文件夹;
3.在Cygwin64中生成配置文件和添加PHP的swoole的扩展;
4.php -m 查看安装是否成功;
上面是我能回忆的安装步骤,大家可以动手尝试安装下;
文件目录大概如下图:
swoole的相关文档链接如下 https://wiki.swoole.com/wiki/page/788.html
1.首先我们先创建TCP的server并命名为server.php 代码如下:
<?php
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
//监听连接进入事件
$serv->on('connect', function ($serv, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, "Server111: ".$data);
});
//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$serv->start();
?>
2.再建立TCP链接server的“客户端”请求并命名为async_client.php
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//注册连接成功回调
$client->on("connect", function($cli) {
$cli->send("hello world\n");
});
//注册数据接收回调
$client->on("receive", function($cli, $data){
echo "Received222: ".$data."\n";
});
//注册连接失败回调
$client->on("error", function($cli){
echo "Connect failed\n";
});
//注册连接关闭回调
$client->on("close", function($cli){
echo "Connection close\n";
});
//发起连接
$client->connect('127.0.0.1', 9501, 0.5);
?>
3.效果如下:
//基本简单的就是这样的,大家可搞搞,还是蛮好玩的。
下面我简单说下工作中用到的swoole技术:
public function start_swoole($data) {
$max_worker_num = 30;
$data_num = count($data);
if ($data_num == 0) {
return;
}
$min_worker_num = min($data_num, $max_worker_num);
$data_arr = array_chunk($data, ceil($data_num / $min_worker_num), true);
$worker_num = ceil($data_num / ceil($data_num / $min_worker_num)); //进程数
$workers = [];
for ($i = 0; $i < $worker_num; $i++) {
$process = new \swoole_process(function (\swoole_process $worker) {
//$arr = [];
$json_data = json_decode($worker->pop(), true);
//业务逻辑处理.....
$worker->exit(0);
}, false, true);
$process->useQueue();
$pid = $process->start(); //开启异步服务进程ID
$workers[$pid] = $process;
}
$j = 0;
foreach ($workers as $pid => $process) {
if (isset($data_arr[$j])) {
$process->push(json_encode($data_arr[$j]));
$j++;
}
}
for ($i = 0; $i < $worker_num; $i++) {
$ret = \swoole_process::wait();
$pid = $ret['pid'];
unset($workers[$pid]);
}
}
//运行的结果是:每个1秒执行输出结果(比如插入更新记录等,外面调用);时间原因就简单介绍下,初步接触学习还希望大家多多指教。