---
## 1. laravel 任務隊列訂單超時支付或者報名超時支付

### 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"/>
> #### 配置文件生效不點擊可能生效不了

### 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'
}
}],
};