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