एक वेबसाइट जो रोज़ाना बैकअप लेती है, पुरानी लॉग फाइलें क्लीन करती है, या हर दिन याद रह जाने वाले मेल भेजती है — और आप हर बार मैन्युअली इसे नहीं कर रहे हैं। यह सब हो सकता है Laravel Scheduler की मदद से।
परिचय
Laravel Scheduler (Laravel की task scheduling सुविधा) आपके Laravel ऐप्लिकेशन के भीतर नियमित कार्यों को निर्धारित करने की एक सरल, साफ़ और expressive विधि है। आम cron jobs लिखने की बजाय, आप उन्हें अपने Laravel कोड में ही परिभाषित करते हैं।
नीचे हम देखेंगे कि कैसे Scheduler काम करता है, कैसे उपयोग करें, और कुछ अनोखे टिप्स और पैकेज्स।
1. Laravel Scheduler का मूल सिद्धांत
- Laravel Scheduler, Artisan commands, closures, और jobs को शेड्यूल करने का तरीका देता है।
- केवल एक ही cron entry (server पर) लगानी होती है, जो हर मिनट Laravel की schedule:run कमांड चलाएगी।
- फिर आपके ऐप के app/Console/Kernel.php में आप सब scheduled tasks लिखते हैं।
cron entry (server पर):
* * * * * cd /path/to/your/project && php artisan schedule:run >> /dev/null 2>&1
यह प्रत्येक मिनट Laravel को बताता है कि “अब चेक करो कौन-कौन से scheduled काम execute होने चाहिए।”
2. Kernel.php में शेड्यूल सेट करना
app/Console/Kernel.php में, आपको schedule मेथड मिलता है। वहाँ आप ऐसे लिख सकते हैं:
protected function schedule(Schedule $schedule)
{
// उदाहरण 1: एक क्लोजर शेड्यूल करना
$schedule->call(function () {
// भेजें एक रिपोर्ट ईमेल
Mail::to('admin@example.com')->send(new DailyReport());
})->dailyAt('06:00');
// उदाहरण 2: एक Artisan कमांड शेड्यूल करना
$schedule->command('cleanup:old-logs')->weekly();
// उदाहरण 3: एक job queue शेड्यूल करना
$schedule->job(new SyncDataJob)->hourly();
// उदाहरण 4: बैकग्राउंड में चलाने के लिए
$schedule->command('heavy:process')->daily()->runInBackground();
}
कुछ प्रमुख शेड्यूलिंग मेथड्स:
| मेथड | विवरण |
|---|---|
| ->everyMinute() | हर मिनट |
| ->everyFiveMinutes() | हर 5 मिनट |
| ->hourly() | हर घंटे |
| ->daily() | रोज़ |
| ->weekly() | हफ़्ते में एक बार |
| ->monthly() | महीने में एक बार |
| ->dailyAt('13:00') | रोज़ 13:00 बजे |
| ->between('8:00','18:00') | समय की सीमा निर्धारित करना |
| ->runInBackground() | काम को बैकग्राउंड टास्क के रूप में चलाना |
💡 नोट: यदि आपके scheduled tasks लंबे समय लेते हैं, तो runInBackground() उपयोग करना अच्छा है। अन्यथा यदि एक task देर तक चलेगा, तो scheduler अगली task को तभी चलाएगा जब पहली खत्म हो जाए। इस समस्या पर एक user ने Reddit पर लिखा:
“I have had major issues … I just discovered that Laravel will run them in order rather than synchronously.”
3. अनोखे टिप्स & एडवांस फीचर्स
3.1 Random Scheduling — “Chaotic Schedule” पैकेज
यदि आप चाहते हैं कि task हर दिन यादृच्छिक (random) समय पर चले — यानी schedule में “मानव-समान” कंटेंट — तो आप Chaotic Schedule पैकेज उपयोग कर सकते हैं। यह dailyAtRandom(), hourlyAtRandom() जैसे macros देता है।
उदाहरण:
$schedule->command('notify:users')->dailyAtRandom('08:00', '12:00');
इस तरह, notify:users हर दिन 8:00 से 12:00 के बीच किसी भी समय चलेगी।
3.2 Dashboard / Monitoring Tools
यदि आप अपने scheduled tasks का execution history, failures, next run time आदि देखना चाहते हैं, तो कुछ टूल्स हैं जैसे Cronboard, Totem, या laravel-admin के scheduling extensions। Reddit
Cronboard जैसे प्लेटफार्म scheduler tasks को visual रूप में दिखाते हैं, failures लॉग करते हैं, और debugging आसान बनाते हैं। Reddit
3.3 Mutex / Overlap रोकना
यदि एक task अगले schedule पर आने से पहले पहले से चल रही है, तो overlap हो सकती है। इसके लिए आप withoutOverlapping() मेथड उपयोग कर सकते हैं:
$schedule->command('report:generate')->daily()->withoutOverlapping();
इसके अलावा, आप onOneServer() का उपयोग कर सकते हैं यदि आपके पास multiple server setup है, ताकि एक ही task विभिन्न सर्वरों पर एक साथ न चले।
4. Debugging और Testing
- Log output: ->sendOutputTo(storage_path('logs/scheduler.log')) या ->appendOutputTo(...) लगाएँ ताकि आप output देख सकें।
- Manually run: php artisan schedule:run चलाकर देख सकते हैं कि कौन-कौन से tasks रन हो रहे हैं।
- Local dev में cron नहीं लगाना चाहिए — इसके बदले php artisan schedule:work का उपयोग कर सकते हैं।
- Cache और समय sync — यदि सर्वर टाइम गलत हो या cache stale हो, scheduler काम नहीं करेगा।
5. उदाहरण प्रोजेक्ट — “Daily Summary Email”
मान लीजिए आप चाहें कि हर रोज़ रात 11:30 बजे आपके ऐप के उपयोगकर्ताओं को एक “Summary Email” भेजा जाए:
एक Artisan command बनाएँ:
php artisan make:command SendSummaryEmail
- handle() में logic लिखें — डेटा इकट्ठा करें, email भेजें।
- Kernel में जोड़ें:
protected function schedule(Schedule $schedule)
{
$schedule->command('email:send-summary')
->dailyAt('23:30')
->withoutOverlapping()
->sendOutputTo(storage_path('logs/summary.log'));
}
- Server पर cron entry सुनिश्चित करें।
- deploy करें और logs check karen ।