企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
--- ## 1. laravel 任务队列订单超时支付或者报名超时支付 ![图片alt](/media/editor/1623219940049_20210603145651159773.png ''图片title'') ### 1. 创建一个队列任务文件 php artisan make:job OrderUnpaidTimeEndJob ### 2. 选择队列存储的方式 (两种方式) QUEUE_CONNECTION=database QUEUE_CONNECTION=redis ### 3. 创建数据表并启动队列 > ps: 因为这里选择的是database就只能先创建两个数据表 php artisan queue:failed-table //失败的队列 php artisan queue:table //进行中的任务队列 php artisan migrate php artisan queue:work //启动队列 php artisan queue --help //查看帮助 ### 4. 监听我们的队列并生成日志文件 `AppServiceProvider.php` public function boot() { Queue::before(function (JobProcessing $event) { $message = ''; $queueData = [ 'action' => $event->job->resolveName(), 'context' => [ 'queue_id' => $event->job->getJobId(), 'data' => [ 'connection' => $event->connectionName, 'body' => $event->job->payload(), ] ], ]; switch ($queueData['action']) { case "App\\Jobs\\OrderUnpaidTimeEndJob": $message = 'StudentSemester_before'; } \Log::error($message, $queueData); }); Queue::after( function (JobProcessed $event) { $message = ''; $queueData = [ 'action' => $event->job->resolveName(), 'context' => [ 'queue_id' => $event->job->getJobId(), 'data' => [ 'connection' => $event->connectionName, 'body' => $event->job->payload(), ] ], ]; switch ($queueData['action']) { case "App\\Jobs\\OrderUnpaidTimeEndJob": $message = 'StudentSemester_after'; } \Log::error($message, $queueData); }); } ### 5. 如何在代码中进行启动 dispatch(new OrderUnpaidTimeEndJob(); > 构造函数编写如下 private $create_time; public function __construct() { // $this->delay($this->create_time->addSeconds(10)); //测试秒超时时间 $this->delay($this->create_time->addMinutes($delayTime)); //真实超时时间 } > 在延迟时间过后会出现执行下面的句柄 public function handle() { $studentSemesterStatus = (new UserService())->systemCancel($this->id); if(!$studentSemesterStatus){ //发送取消保密性信息 MSG TODO $this->job->delete(); //延迟发送 } } > 失败后记录日志 public function failed($exception = null) { \Log::error('studentSemesterService: ' . $exception->getMessage()); //记录日志 //失败后的操作 TODO } ### 6. 测试的方法 > #### 在 phpunit 中我们需要修改如下代码下面的是同步方法, 异步就填写为 database <server name="QUEUE_CONNECTION" value="sync"/> > #### 配置文件生效不点击可能生效不了 ![图片alt](/media/editor/1624248117818_20210616122058745383.png ''图片title'') ### 7. 如何重试失败的队列, 使用 Laravel 的门面方法 Artisan::call('queue:retry', ['id' => [$id]]); ### 8. 配合 node.js 的任务管理器 ecosystem.config.js module.exports = { apps: [{ name: 'queue order', script: 'artisan', 'cwd': '/apps', args: 'queue:work', instances: 1, autorestart: true, watch: false, max_memory_restart: '1G', interpreter: 'php', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' } }], };