美文网首页PHP学习PHP经验分享PHP实战
PHP swoole (2.异步任务队列)

PHP swoole (2.异步任务队列)

作者: Separes | 来源:发表于2017-05-31 17:18 被阅读731次

    文档: https://wiki.swoole.com/wiki/page/p-client.html

    思路:

    • 如果某一次业务或运算处理时间过长,一方面可能会在客户端产生长时间的等待,影响体验及交互;另一方面可能超过PHP中约定的max_execution_time而返回500;
    • 异步请求可以将任务交到后台进行,实时返回请求状态(true或success);
    • 异步请求可以将复杂逻辑及封装拆分进任务队列处理,减少单个任务的处理时间,尽量避开max_execution_time的限制;

    demo:

    • Client:
    $client = new swoole_client(SWOOLE_SOCK_TCP);
    $ip = "10.0.0.75";
    $port = 7728;
    
    //连接到服务器
    if (!$client->connect($ip, $port, 0.5))
    {
        die("connect failed.");
    }
    //向服务器发送数据
    if (!$client->send("hello world!!"))
    {
        die("send failed.");
    }
    //从服务器接收数据
    $data = $client->recv();
    if (!$data)
    {
        die("recv failed.");
    }
    else {
        echo $data;
        $client->close();
    }
    
    • Server:
    $ip = "10.0.0.75";
    $port = 7728;
    $serv = new swoole_server($ip, $port);
    
    //设置异步任务的工作进程数量
    $serv->set(array('task_worker_num' => 4));
    
    $serv->on('receive', function($serv, $fd, $from_id, $data) {
        //投递异步任务
        $task_id = $serv->task($data);
        $serv->send($fd, "request delivered and sleeping for 6 secs");
        echo "Dispath AsyncTask: id=$task_id".PHP_EOL;
    });
    
    //处理异步任务
    $serv->on('task', function ($serv, $task_id, $from_id, $data) {
        // PHP_EOL: 换行符
        // 增加一个sleep验证异步执行
        sleep(5);
        echo "New AsyncTask[id=$task_id]".PHP_EOL;
        //返回任务执行的结果
        $serv->finish("$data -> OK");
    });
    
    //处理异步任务的结果
    $serv->on('finish', function ($serv, $task_id, $data) {
        echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
    });
    
    $serv->start();
    
    • 结果
    Dispath AsyncTask: id=0
    New AsyncTask[id=0]
    AsyncTask[0] Finish: hello world!! -> OK
    
    

    那么,当一次task没有结束时有新的task添加到任务队列会怎么样呢?
    我们以不同频率执行六次客户端的请求试试:

    • 结果
    Dispath AsyncTask: id=0
    Dispath AsyncTask: id=1
    Dispath AsyncTask: id=2
    New AsyncTask[id=0]
    AsyncTask[0] Finish: hello world!! -> OK
    Dispath AsyncTask: id=3
    New AsyncTask[id=1]
    AsyncTask[1] Finish: hello world!! -> OK
    Dispath AsyncTask: id=4
    Dispath AsyncTask: id=5
    New AsyncTask[id=2]
    AsyncTask[2] Finish: hello world!! -> OK
    New AsyncTask[id=3]
    AsyncTask[3] Finish: hello world!! -> OK
    New AsyncTask[id=4]
    AsyncTask[4] Finish: hello world!! -> OK
    New AsyncTask[id=5]
    AsyncTask[5] Finish: hello world!! -> OK
    
    

    显然, 当队列被block时,task会被继续添加到任务队列中,但这并不会影响异步任务原本的执行逻辑.
    与此同时,Client在每次请求后都会获得及时的return.

    相关文章

      网友评论

      本文标题:PHP swoole (2.异步任务队列)

      本文链接:https://www.haomeiwen.com/subject/oojjfxtx.html