摘要:導語之前寫過使用的進行定時任務,實際上也可以執行定時任務。需求是統計每日訪問的數,雖然數據表中有數據,為了演示,新建監聽器統計。記錄這篇文章中介紹了實現了事件監聽器,在此基礎上進行擴展。
導語
之前寫過使用 Linux 的進行定時任務,實際上 laravel 也可以執行定時任務。需求是統計每日訪問的 IP 數,雖然數據表中有數據,為了演示,新建監聽器統計。
記錄 IP這篇文章中介紹了實現了事件/監聽器,在此基礎上進行擴展。
注冊一個新的監聽器,在 app/Providers/EventServiceProvider.php 文件中新添加 CreateUserIpLog
/** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], "AppEventsUserBrowse" => [ "AppListenersCreateBrowseLog",// 用戶訪問記錄 "AppListenersCreateUserIpLog",// 用戶 IP 記錄 ], ];
添加完成后執行 php artisan event:generate,創建好了 app/Listeners/CreateUserIpLog.php 文件;
在新建監聽器中,記錄用戶的 IP,使用 Redis 的 Set 數據類型進行記錄,代碼如下
/** * Handle the event. * 記錄用戶 IP * @param UserBrowse $event * @return void */ public function handle(UserBrowse $event) { $redis = Redis::connection("cache"); $redisKey = "user_ip:" . Carbon::today()->format("Y-m-d"); $isExists = $redis->exists($redisKey); $redis->sadd($redisKey, $event->ip_addr); if (!$isExists) { // key 不存在,說明是當天第一次存儲,設置過期時間三天 $redis->expire($redisKey, 259200); } }統計訪問
上面將用戶的 IP 記錄下來,然后就是編寫統計代碼
新建一個任務 php artisan make:command CountIpDay,新建了 app/Console/Commands/CountIpDay.php 文件;
設置簽名 protected $signature = "countIp:day"; 和描述 protected $description = "統計每日訪問 IP";
在 handle 方法中編寫代碼,也可以在 kernel.php 中使用 emailOutputTo 方法發送郵件
/** * Execute the console command. * * @return mixed */ public function handle() { $redis = Redis::connection("cache"); $yesterday = Carbon::yesterday()->format("Y-m-d"); $redisKey = "user_ip:" . $yesterday; $data = $yesterday . " 訪問 IP 總數為 " . $redis->scard($redisKey); // 發送郵件 Mail::to(env("ADMIN_EMAIL"))->send(new SendSystemInfo($data)); }設置任務調度
編輯 app/Console/Kernel.php 的 $commands
/** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ AppConsoleCommandsCountIpDay::class, ];
在 schedule 方法中設置定時任務,執行時間為每天凌晨一點
/** * Define the application"s command schedule. * * @param IlluminateConsoleSchedulingSchedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command("countIp:day")->dailyAt("1:00"); }
最后是在 Linux 中添加定時任務,每分鐘執行一次 artisan schedule:run,如下
* * * * * /you_php you_path/artisan schedule:run >> /dev/null 2>&1
參考資料:laravel 任務調度、Laravel定時任務調度例子——統計每周新增的用戶數量
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31206.html
摘要:如果任務沒有在規定時間內完成,那么該有序集合的任務將會被重新放入隊列中。這兩個進程操縱了三個隊列,其中一個,負責即時任務,兩個,負責延時任務與待處理任務。如果任務執行成功,就會刪除中的任務,否則會被重新放入隊列中。 在實際的項目開發中,我們經常會遇到需要輕量級隊列的情形,例如發短信、發郵件等,這些任務不足以使用 kafka、RabbitMQ 等重量級的消息隊列,但是又的確需要異步、重試...
摘要:高性能高精度定時服務,輕松管理千萬級定時任務。支持任務到期觸發和。支持創建延時任務和定時到期任務,和原生保持相同接口,輕松使用。不支持任務輸出任務鉤子及維護模式。是不指定任務名時自動生成,每個任務名必須唯一,相同任務名重復定義將會自動覆蓋。 Forsun高性能高精度定時服務,輕松管理千萬級定時任務。 定時服務項目地址:https://github.com/snower/forsun l...
摘要:所以在這里創建一個事件的兩個實際方法是通過調用或,第一個提交一個的實例,后者提交來做一些特殊處理。那么會用表達式檢查命令是否到期嗎恰恰相反,使用庫來確定命令是否基于當前系統時間相對于我們設置的時區。 譯文GitHub https://github.com/yuansir/diving-laravel-zh 原文鏈接 https://divinglaravel.com/task-sche...
摘要:表示該工作應該在每個月日上午運行這里還有一些其他的示例表示工作應該在星期三每分鐘運行一次。表示該工作應該每天在凌晨點和點運行兩次。方法調用的實例作為唯一的參數,這是用于記錄您提供的作業的計劃任務管理器,并決定每次守護進程應該運行什么。 譯文GitHub https://github.com/yuansir/diving-laravel-zh 原文鏈接 https://divinglar...
閱讀 1072·2021-11-25 09:43
閱讀 696·2021-11-22 14:45
閱讀 3816·2021-09-30 09:48
閱讀 1061·2021-08-31 09:41
閱讀 1970·2019-08-30 13:52
閱讀 1976·2019-08-30 11:24
閱讀 1341·2019-08-30 11:07
閱讀 950·2019-08-29 12:15