`

Swoole的安装和简单应用

阅读更多

由于最近的项目运用到了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秒执行输出结果(比如插入更新记录等,外面调用);时间原因就简单介绍下,初步接触学习还希望大家多多指教。

 

 

  • 大小: 19.1 KB
  • 大小: 65.7 KB
  • 大小: 54.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics