今天作商城項目的時候,須要將用戶的待付款訂單一個小時後自動取消。那麼這個操做,不多是人爲的,只能藉助
linux
的cron
來進行作定時任務了。php
總體思路:
首先,在 Order
模型裏寫一個 public
方法,將查詢到的半個小時以外還沒付款的訂單,將其狀態所有改成 已取消的狀態。
其次,自定義命令,執行該方法。
最後呢,就是將其命令註冊到調度任務裏自動執行便可。linux
// 在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());
}
複製代碼
首先跑如下生成命令類緩存
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
複製代碼
更新app/Console/Kernel.phpssh
<?php
.
.
.
class Kernel extends ConsoleKernel {
.
.
.
protected function schedule(Schedule $schedule) {
// 一小時執行一次『活躍用戶』數據生成的命令
$schedule->command('asshop:cancel-unpaid-order')->everyMinute();
}
.
.
.
}
複製代碼
linux
的cron
進行定時執行//編輯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