PHP使用swoole来实现实时异步任务队列

看swoole的官方文档,真的很迷茫,文档里都是些零碎的点,这些点怎么串起来的,还得需要自己摸索。比如手册里将不同的进程分开来讲,但实际开发的过程中,使用却是一起使用的。比如任务队列。手册里的资料有一下几个地方
https://wiki.swoole.com/wiki/page/481.html
https://wiki.swoole.com/wiki/page/134.html
https://wiki.swoole.com/wiki/page/54.html
第一个是实例,但第二个和第三个页面确实从进程的角度去讲的,如果没有开发经验,的人真的很难明白是怎么回事。
下面说下我的理解吧。
server 函数列表https://wiki.swoole.com/wiki/page/15.html
server事件列表https://wiki.swoole.com/wiki/page/41.html
server中所有的函数都是主动发起一件事,而与之对应的,都有一个事件去接收。这就好比一个老板一个秘书,老板说我要去酒店,于是秘书就订酒店。对应到swoole中,函数就是老板,函数说我要发起一个任务,于是onTask事件,就开始工作了。很抽象,下面看代码
class msgServer
{
private $serv;

function __construct()
{

    $this->serv = new Swoole\Server("127.0.0.1", 9501);//创建一个服务
    $this->serv->set(array('task_worker_num' => 4)); //配置task进程的数量
    $this->serv->on('receive', array($this, 'onReceive'));//有数据进来的时候执行
    $this->serv->on('task', array($this, 'onTask'));//有任务的时候执行
    $this->serv->on('finish', array($this, 'onFinish'));//任务结束时执行
    $this->serv->start();
}


public function onReceive($serv, $fd, $from_id, $data)
{   
    $data = json_decode($data, true);
    $task_id = $serv->task($data);//这里发起了任务,于是上面的on('task', array($this, 'onTask'))就会执行

}

public function onTask($serv, $task_id, $from_id, $data)
{
    $data['send_res'] = $this->sendMsg($data); //发送短信
    //1.7.3之前,是$serv->finish("result");
   return "result.";//这里告诉任务结束,于是上面的on('finish', array($this, 'onFinish'))就会执行
}

public function onFinish($serv, $task_id, $data)
{
    $this->addSendLog($data); //添加短信发送记录
}

}

$msgServ = new msgServer;
看到是不是有点绕,为什么没有进程呢?这是因为开发过程中你无需关注进程,只需要使用server。swoole会自己处理进程的。你只需要设置一下,但是手册中每次都提到进程,主要是给有经验的开发者看的,他们会关注关于进程和现在的控制

posted @ 2017-09-13 10:14  yonomo  阅读(248)  评论(0编辑  收藏  举报