如何使用hhxsv5/laravel-s的异步任务队列


如果你还没有安装hhxsv5/laravel-s,可以跳转去安装
laravel下安装laravels以及websocket的使用

此特性依赖Swoole的AsyncTask,必须先设置config/laravels.php的swoole.task_worker_num。异步任务的处理能力受Task进程数影响,需合理设置task_worker_num

创建任务类

<?php
/**
 * Created by PhpStorm.
 * User: wxiangqian
 */
namespace App\Tasks;

use Hhxsv5\LaravelS\Swoole\Task\Task;
use Illuminate\Support\Facades\Log;

class TestTask extends Task
{
    private $data;
    private $result;
    public function __construct($data)
    {
        $this->data = $data;
    }
    // 处理任务的逻辑,运行在Task进程中,不能投递任务
    public function handle()
    {
        Log::info(__CLASS__ . ':handle start', [$this->data]);
        sleep(2);// 模拟一些慢速的事件处理
        // 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch
        $this->result = 'the result of ' . $this->data;
    }

    // 可选的,完成事件,任务处理完后的逻辑,运行在Worker进程中,可以投递任务
    public function finish()
    {
        \Log::info(__CLASS__ . ':finish start', [$this->result]);
        Task::deliver(new TestTask2('task2')); // 投递其他任务
    }
}

投递任务

// 实例化TestTask并通过deliver投递,此操作是异步的,投递后立即返回,由Task进程继续处理TestTask中的handle逻辑
use Hhxsv5\LaravelS\Swoole\Task\Task;
$task = new TestTask('task data');
// $task->delay(3); // 延迟3秒投递任务
// $task->setTries(3); // 出现异常时,累计尝试3次
$ret = Task::deliver($task);
var_dump($ret);// 判断是否投递成功

常见问题

报错:Class swoole does not exist

  • 在LaravelS中,Swoole是以cli模式启动的Http Server,替代了FPM。
  • 投递任务、触发异步事件都会调用app(‘swoole’),从Laravel容器中获取Swoole\http\server实例。只有在LaravelS启动时,才会注入这个实例到容器中。
  • 所以,一旦脱离LaravelS,由于跨进程,以下情况,你将无法成功调用app(‘swoole’):
    • 以各种命令行方式运行的代码,例如Artisan命令行、PHP脚本命令行;
    • 运行在FPM/Apache PHP Module下的代码,查看SAPI Log::info(‘PHP SAPI’, [php_sapi_name()]);。

ps: 应通过websocket连接的形式去投递任务

websocket的使用跳转上篇文章:laravel下安装laravels以及websocket的使用
修改onMessage中的代码即可测试

public function onMessage(Server $server, Frame $frame)
{
     $task = new TestTask('task data');
      // $task->delay(3); // 延迟3秒投递任务
      // $task->setTries(3); // 出现异常
      $ret = Task::deliver($task);
      $server->push($frame->fd, $ret);
}

结束语

希望本文可以帮助大家学习如何使用异步任务队列。👍


文章作者: WXiangQian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WXiangQian !
 上一篇
Linux下centos配置网卡ip地址、网关、DNS信息 Linux下centos配置网卡ip地址、网关、DNS信息
查看网卡信息ifconfig ip地址为:192.168.18.200,网关为:255.255.255.0 修改网卡信息切换到指定目录下 cd /etc/sysconfig/network-scripts/ ls寻找自己的网卡信息,
2021-05-26
下一篇 
laravel/telescope望远镜在laravel6下安装以及使用 laravel/telescope望远镜在laravel6下安装以及使用
介绍 Telescope 是一个非常优雅的调试助手,提供了非常丰富的 Debug 功能,给开发及调试带来了极大的方便,如果你一直使用 Clockwork 或者 Laravel Debugbar 进行项目的调试,那么现在又多了一个新的选择。不
2020-12-17
  目录