Laravel——自定義命令command

今天作商城項目的時候,須要將用戶的待付款訂單一個小時後自動取消。那麼這個操做,不多是人爲的,只能藉助 linuxcron 來進行作定時任務了。php

總體思路:
首先,在 Order 模型裏寫一個 public 方法,將查詢到的半個小時以外還沒付款的訂單,將其狀態所有改成 已取消的狀態。
其次,自定義命令,執行該方法。
最後呢,就是將其命令註冊到調度任務裏自動執行便可。linux

  1. 編寫public cancelUnpaidOrder的方法
// 在Order模型裏
public function cancelUnpaidOrder() {
    self::where('status', 1)
        ->where('created_at', '<=', date('Y-m-d H:i:s',time() - 30 * 60))
        ->update(['status' => 0]);//我這裏的狀態爲0 就是表明取消訂單
        
    //清除緩存(通常作了緩存的這裏得清除一下)
    Cache::forget('status_counts_'.Auth::id());
    Cache::forget('count_all'.Auth::id());    
}
複製代碼
  1. 自定義命令

首先跑如下生成命令類緩存

php artisan make:command CancelUnpaidOrder --command=asshop:cancel-unpaid-order
複製代碼

執行完,以後就能夠打開生成的類文件app\CancelUnpaidOrder.phpbash

<?php

namespace App\Console\Commands;

use App\Models\Shop\Order;
use Illuminate\Console\Command;

class CancelUnpaidOrder extends Command {   // 供咱們調用命令
    protected $signature = 'asshop:cancel-unpaid-order';
    // 命令的描述
    protected $description = '定時自動取消待付款訂單';
    
    // 最終執行的方法
    public function handle(Order $order) {
        // 在命令行打印一行信息
        $this->info("開始查找...");
        $order->cancelUnpaidOrder();
        $this->info("執行成功!");
    }
}
複製代碼

而後執行下面命令就能執行編寫的方法。app

php artisan larabbs:cancel-unpaid-order
複製代碼
  1. 註冊到調度任務

更新app/Console/Kernel.phpssh

<?php
.
.
.
class Kernel extends ConsoleKernel {
    .
    .
    .
    protected function schedule(Schedule $schedule) {
        // 一小時執行一次『活躍用戶』數據生成的命令
         $schedule->command('asshop:cancel-unpaid-order')->everyMinute();
    }
    .
    .
    .
}
複製代碼
  1. 利用linuxcron進行定時執行
//編輯crontab
export EDITOR=vi && crontab -e
複製代碼

添加你的命令到crontab裏 ,寫本身的php路徑 和項目的路徑~ui

* * * * * /www/server/php/72/bin/php /www/wwwroot/asshop/artisan schedule:run >> /dev/null 2>&1
複製代碼

千萬要注意必定要用絕對路徑喲~表示踩坑過來的。this

大功告成~spa

相關文章
相關標籤/搜索