搜尋
首頁後端開發php教程laravel 基础教程 -- 任务计划

任务计划(Task Scheduling)

简介

在过去,开发者需要手动的在计划表中添加一行来录入定时执行的任务。这是非常让人头疼的,因为你不得不手动的登录远端服务器去做这些事情,它并不能在代码中有效的控制。Laravel 的命令调度者允许你在 Laravel 中流利通畅的定义你的任务计划,并且,你只需要为此在服务器中增加一个单独的定时任务条目就可以了,之后就可以在代码中进行控制任务计划的数量。

你的任务计划被定义在 app/Console/Kernel.php 文件的 schedule 方法中。在开始之前,我们先看一个简单的例子。你可以在 Schedule 对象中添加任意你希望执行的任务计划。

开始运行计划

你只需要在你的服务器的 Cron 项中添加如下条目:

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

该 Cron 会每分钟调用 Laravel 的命令调度来执行计划任务。Laravel 会自动的评估你的任务计划并执行到期的任务。

定义任务

你可以在 App\Console\Kernel 类的 schedule 方法中定义所有的任务计划。在开始之前,先让我们看一个任务计划的简单例子。在这个例子中,我们会在每天的午夜执行 Closure。在 Closure 中我们会执行清除数据库表的查询语句:

<?phpnamespace App\Console;use DB;use Illuminate\Console\Scheduling\Schedule;use Illuminate\Foundation\Console\Kernel as ConsoleKernel;class Kernel extends ConsoleKernel{  /**   * The Artisan commands provided by your application.   *   * @var array   */   protected $commands = [     \App\Console\Commands\Inspire::class,   ];   /**    * Define the application's command schedule.    *    * @param \Illuminate\Console\Scheduling\Schedule $schedule    * @return void    */    protected function schedule(Schedule $schedule)    {      $schedule->call(function () {        DB::table('recent_users')->delete();      })->daily();    }}

除了可以调度 Closure 调用,你也可以调度 Artisan 命令和操作系统的命令。比如,你可以使用 command 方法来调度一个 Artisan 命令:

$schedule->command('emails:send --force')->daily();

你可以使用 exec 方法来发布一个命令到操作系统中:

$schedule->exec('node /home/forge/script.js')->daily();

调度频率选项

当然,这里还有各种可以分配到任务的调度方法:

方法 描述
->cron('* * * * * *'); 执行自定义的 Cron 任务计划
->everyMinute(); 每分钟执行一次任务
->everyFiveMinutes(); 每五分钟执行一次任务
->everyTenMinutes(); 每十分钟执行一次任务
->hourly(); 每一小时执行一次任务
->daily(); 每天的午夜执行一次任务
->dailyAt('13:00'); 每天的 13:00 执行一次任务
->twiceDaily(1, 13); 每天的 1:00 & 13:00 执行一次任务
->weekly(); 每周执行一次任务
->montyly(); 每月执行一次任务
->monthlyOn(4, '15:00'); 每月的 4 号 15:00 执行一次任务
->quarterly(); 每季度执行一次任务
->yearly(); 每年执行一次任务
->timezone('America/New_York'); 设置时区

这些方法可以与额外的限制相结合以创建更加细微调整的计划,比如仅在一周的某几天运行。让我们调度一个计划命令来在每周的周一执行:

// Run once per week on Monday at 1 PM...$schedule->call(function () {  //})->weekly()->mondays()->at('13:00');// Run hourly from 8 AM to 5 PM on weekdays...$schedule->command('foo')         ->weekdays()         ->hourly()         ->timezone('America/Chicago')         ->when(function () {           return date('H') >= 8 && date('H') <= 17;         });

下面列出了额外的计划约束条件:

方法 描述
->weekdays(); 限制在平常日内(周六、日除外)
->sundays(); 限制在周日
->mondays(); 限制在周一
->tuesdays(); 限制在周二
->wednesdays(); 限制在周三
->thursdays(); 限制在周四
->fridays(); 限制在周五
->staturdays(); 限制在周六
->when(Closure); 限制基于真值测试

真值约束

when 方法可以基于给定的真值测试的结果来约束一个任务的执行。换种说法就是,如果给定的 Closure 返回 true,那么只要其他约束并不阻止任务的执行时,该任务就会被执行:

$schedule->command('emails:send')->daily()->when(function () {  return true;});

skip 方法刚好与 when 相反。如果 skip 方法返回 true,那么调度任务将不会执行:

$schedule->command('emails:send')->daily()->skip(function () {  return true; });

当链式调用 when 方法时,只有在所有的 when 约束返回 true 时才会执行调度任务命令。

避免任务重叠

默认的,如果前一个任务还在进程中,计划任务还是会再次运行的。你可以使用 withoutOverlapping 方法来避免这个:

$schedule->command('emails:send')->withoutOverlapping();

在这个例子中,emails:send Artisan 命令每分钟都会被调度,但是只有在进程中没有运行该命令时才会再次执行。withoutOverlapping 方法对于无法确定执行时间的任务特别有效,这样就可以避免同时执行越来越多的耗时任务增大服务器的压力。

任务输出

Laravel 的任务计划提供了多种方便的方法来生成计划任务的输出。首先,你需要使用 sendOutputTo 方法,你可以传递一个文件路径到方法以便之后的检查:

$schedule->command('emails:send')         ->daily()         ->sendOutputTo($filePath);

如果希望追加内容到给定的文件,你应该使用 appendOutputTo 方法:

$schedule->command('emails:send')         ->daily()         ->appendOutputTo($filePath);

你可以使用 emailOutputTo 方法来将输出发送到你选定的邮箱地址中。但是你需要注意的是,你必须先使用 sendOutputTo 方法将输出发送到文件中。并且,在通过邮件发送任务的输出之前,你需要先配置好 laravel 的邮件服务:

$schedule->command('foo')         ->daily()         ->sendOutputTo($filePath)         ->emailOutputTo('foo@example.com')

注意:emailOutputTo 和 sendOutputTo 方法只能在 command 方法中执行,并不支持 call 方法的调用。

任务钩子

你可以使用 before 和 after 方法来在任务计划执行或者完成时执行特定的操作:

$schedule->command('emails:send')         ->daily()         ->before(function () {           // Task is about to start...         })         ->after(function () {           // Task is complete...         });

Pingings URLs

使用 pingBefore 和 thenPing 方法,任务调度可以自动的在任务完成之前或者之后 ping 给定的 URL。这些方法通常用来通知外部的服务。比如 Laravel Envoyer,告知其计划任务将要执行或者已经完成:

$schedule->command('emails:send')         ->daily()         ->pingBefore($url)         ->thenPing($url);

使用 pingBefore($url) 或者 thenPing($url) 方法都需要引入 Guzzle HTTP 类库。你可以通过 Composer 来进行安装:

"guzzlehttp/guzzle": "~5.3|~6.0"
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP的目的:構建動態網站PHP的目的:構建動態網站Apr 15, 2025 am 12:18 AM

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP:處理數據庫和服務器端邏輯PHP:處理數據庫和服務器端邏輯Apr 15, 2025 am 12:15 AM

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

您如何防止PHP中的SQL注入? (準備的陳述,PDO)您如何防止PHP中的SQL注入? (準備的陳述,PDO)Apr 15, 2025 am 12:15 AM

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python:代碼示例和比較PHP和Python:代碼示例和比較Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP行動:現實世界中的示例和應用程序PHP行動:現實世界中的示例和應用程序Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:輕鬆創建交互式Web內容PHP:輕鬆創建交互式Web內容Apr 14, 2025 am 12:15 AM

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python:比較兩種流行的編程語言PHP和Python:比較兩種流行的編程語言Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP的持久相關性:它還活著嗎?PHP的持久相關性:它還活著嗎?Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中