如果您問「Yii 是什麼?」請參閱我之前的教學:Yii 框架簡介,其中回顧了Yii 的優點,並概述了2014 年10月發布的Yii 2.0 的新增功能。 嗯>
在這個使用 Yii2 程式設計系列中,我將引導讀者使用 Yii2 PHP 框架。在今天的教學中,我將與您分享如何利用 Yii 的控制台功能來執行 cron 作業。
過去,我在 cron 作業中使用了 wget — 可透過 Web 存取的 URL 來執行我的背景任務。這引發了安全性問題並存在一些效能問題。雖然我在我們的啟動系列安全性專題中討論了一些減輕風險的方法,但我曾希望過渡到控制台驅動的命令。對 Yii2 來說,這相當簡單。
對於今天的範例,我將在我的 Twixxr 網站上示範基於控制台的 cron 命令,我在本 Twitter API 劇集中對此進行了描述。由於速率限制和效能管理問題,Twitter API 非常依賴高效、可靠的 cron 任務。所以這是一個很好的例子,可以與您分享。
在開始之前,我要重申:我始終感謝您的想法和回饋。如果您有問題或主題建議,請在下面的評論中發表您的想法。您也可以直接透過 Twitter @reifman 聯繫我。
維基百科將 cron 描述為「類別 Unix 電腦作業系統中基於時間的作業排程器」。這是相當準確的。基本上,cron 運行我們運行 Web 服務所需的所有後台任務,從日誌管理和備份到 API 請求再到資料庫清理。
#要查看伺服器上現有的 cron 作業,您通常會輸入 sudo crontab -l
並看到以下內容:
# Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command */3 * * * * wget -O /dev/null https://meetingplanner.io/daemon/frequent */15 * * * * wget -O /dev/null http://meetingplanner.io/daemon/quarter 0 * * * * wget -O /dev/null http://meetingplanner.io/daemon/hourly 15 1 * * * wget -O /dev/null http://meetingplanner.io/daemon/overnight 40 2 * * * /usr/sbin/automysqlbackup 15 3 * * 5 wget -O /dev/null http://meetingplanner.io/daemon/weekly 30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
左側指定每 3 或 15 分鐘或每天午夜等啟動這些任務,右側是要執行的腳本。 另請參閱使用 Cron 作業排程任務 (Envato Tuts )。
請注意 Let's Encrypt 腳本是一個獨特的控制台命令。它從我們伺服器上的命令列運行。但是,我上面的所有會議計劃任務都是透過 wget 運行的。這就像一個機器人在特定時間在網頁瀏覽器上運行針對我們執行後台任務的網路應用程式的請求。
除了外部 Web 要求所需的開銷和伺服器上腳本的逾時限制之外,您還必須保護這些存取點。以下是會議策劃者如何執行此操作的範例:
// only cron jobs and admins can run this controller's actions public function beforeAction($action) { // your custom code here, if you want the code to run before action filters, // which are triggered on the [[EVENT_BEFORE_ACTION]] event, e.g. PageCache or AccessControl if (!parent::beforeAction($action)) { return false; } // other custom code here if (( $_SERVER['REMOTE_ADDR'] == $_SERVER['SERVER_ADDR'] ) || (!\Yii::$app->user->isGuest && \common\models\User::findOne(Yii::$app->user->getId())->isAdmin())) { return true; } return false; // or false to not run the action }
它會驗證使用者是否以管理員身分登入或以相同的 Internet IP 位址在伺服器上本機執行。
Alex Makarov 是 Yii 框架開發的主要志工之一,當我定期撰寫有關 Envato Tuts 框架的文章時,他幫助回答了我的問題。讀完我的安全事件後,他問我為什麼不使用 Yii2 固有的控制台功能來執行 cron 作業。基本上我不知道。
就像我有一個 /frontend/controllers/DaemonController.php 一樣,我創建了一個 /console/controllers/DaemonController.php。在本教程中,我將為更小、更簡單的 Twixxr Web 服務執行此操作。
我習慣使用控制台運行資料庫遷移(例如 ./yii migrate/up 7
),但僅此而已。我很想嘗試使用它來執行後台任務。
正如我在之前的教程中所寫的,我的新生網站 Twixxr 需要大量的後台進程來定期輪換 API 調用,以滿足所有用戶請求,以與女性擁有的有影響力的 Twitter 帳戶交友。
主頁如下所示:
所以我認為 Twixxr 會成為運行基於控制台的 cron 控制器的一個很好的測試平台。
#這是我的新的基於控制台的 DaemonController.php 的核心:
<?php namespace console\controllers; use Yii; use yii\helpers\Url; use yii\console\Controller; use frontend\models\Twixxr; /** * Test controller */ class DaemonController extends Controller { public function actionIndex() { echo "Yes, cron service is running."; } public function actionFrequent() { // called every two minutes // */2 * * * * ~/sites/www/yii2/yii test $time_start = microtime(true); $x = new \frontend\models\Twixxr(); $x->process($time_start); $time_end = microtime(true); echo 'Processing for '.($time_end-$time_start).' seconds'; } public function actionQuarter() { // called every fifteen minutes $x = new \frontend\models\Twixxr(); $x->loadProfiles(); } public function actionHourly() { // every hour $current_hour = date('G'); if ($current_hour%4) { // every four hours } if ($current_hour%6) { // every six hours } }
請注意,它與我的基於前端的控制器的結構非常相似,但它無法安全地透過網路訪問,因為它位於 /console 樹中。沒有設定 Apache 網頁伺服器網站來瀏覽此區域。
因此,在上面的範例中,actionFrequent()
將每兩到三分鐘呼叫一次。它處理另一組 Twixxr 友誼請求。另一方面,actionQuarter()
每 15 分鐘調用一次,並更新瀏覽帳戶的設定檔資訊。讓我們看看 cron 檔案中的計劃是如何運作的。
本質上,在我的 crontab 檔案中,我將 wget 替換為直接 Linux 腳本,如上所示,用於 Let's Encrypt 續訂。
您輸入 sudo crontab -e
進行編輯,或輸入 -l
列出其內容。這是我的 Twixxr cron 檔案:
$ sudo crontab -l # m h dom mon dow command */3 * * * * /var/www/twixxr/yii daemon/frequent */15 * * * * /var/www/twixxr/yii daemon/quarter 0 * * * * /var/www/twixxr/yii daemon/hourly 15 1 * * * /var/www/twixxr/yii daemon/overnight 15 3 * * 5 /var/www/twixxr/yii daemon/weekly #40 2 * * * /usr/sbin/automysqlbackup 30 2 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
这非常简单。 /var/www/twixxr/yii daemon/frequent
的左侧是 yii 解释器所在的路径,右侧是控制台控制器和调用的方法。 p>
切换时一切都很顺利。我还没有切换 Meeting Planner,因为我想做更多测试。当后台任务中断时,很难知道也很难调试它们(尽管 Sentry 错误日志记录有很大帮助)。
我遇到的一个问题是控制台命名空间与前端命名空间不同,因此,例如,我在教程中设置的 SiteHelper.php 组件(该组件描述了从单个代码库运行多个网站)失败了当我调用它时。删除它是有效的,但我需要运行测试以确保底层后台代码仍然有效。不过,大部分情况下切换都很顺利。
与任何其他代码更改一样,彻底测试和监控。
展望未来,我将探索在 Yii2 框架内构建 REST API,该框架恰好依赖于创建一个不同的子树,例如控制台树,但用于外部 API。当然,这会带来复杂的身份验证和安全问题……所以与您一起探索这些将会很有趣。我将从多个角度研究 API。我对此感到非常兴奋。
请观看我的“使用 Yii2 编程”系列中即将推出的教程,我将继续深入研究该框架的不同方面。另请浏览“使用 PHP 构建您的初创公司”系列,其中记录了构建 Simple Planner 和 Meeting Planner 的过程。
如果您想知道下一个 Yii2 教程何时发布,请在 Twitter 上关注我 @reifman 或查看我的讲师页面以获取更新。
以上是Yii2程式設計指南:執行Cron服務的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!