如何使用hhxsv5/laravel-s的异步任务队列
Posted WXiangQian王先森
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用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);
结束语
希望本文可以帮助大家学习如何使用异步任务队列。👍
相关文章
laravel下安装laravels以及websocket的使用
以上是关于如何使用hhxsv5/laravel-s的异步任务队列的主要内容,如果未能解决你的问题,请参考以下文章