Wenn Sie fragen: „Was ist Yii?“ schauen Sie sich mein vorheriges Tutorial an: Einführung in das Yii-Framework, das die Vorteile von Yii bespricht und die Neuerungen in Yii 2.0 beschreibt, das im Oktober 2014 veröffentlicht wurde. Hmm>
In dieser Serie „Programmieren mit Yii2“ werde ich die Leser durch die Verwendung des Yii2-PHP-Frameworks führen. Im heutigen Tutorial werde ich Ihnen zeigen, wie Sie die Konsolenfunktionalität von Yii nutzen können, um Cron-Jobs auszuführen.
In der Vergangenheit habe ich wget – eine über das Internet zugängliche URL – in einem Cronjob verwendet, um meine Hintergrundaufgaben auszuführen. Dies wirft Sicherheitsbedenken auf und hat einige Leistungsprobleme zur Folge. Während ich einige Möglichkeiten zur Risikominimierung in unserer Boot Series-Sicherheitsfunktion besprochen habe, hatte ich gehofft, auf konsolengesteuerte Befehle umsteigen zu können. Mit Yii2 ist das ziemlich einfach.
Für das heutige Beispiel demonstriere ich den konsolenbasierten Cron-Befehl auf meiner Twixxr-Site, den ich in dieser Twitter-API-Episode beschreibe. Aufgrund von Ratenbegrenzungs- und Leistungsverwaltungsproblemen ist die Twitter-API stark auf effiziente, zuverlässige Cron-Jobs angewiesen. Das ist also ein großartiges Beispiel, das Sie mit Ihnen teilen können.
Bevor ich anfange, möchte ich noch einmal betonen: Ich freue mich immer über Ihre Ideen und Ihr Feedback. Wenn Sie Fragen oder Themenvorschläge haben, posten Sie Ihre Gedanken bitte unten in den Kommentaren. Sie können mich auch direkt auf Twitter @reifman kontaktieren.
Wikipedia beschreibt Cron als „einen zeitbasierten Job-Scheduler in Unix-ähnlichen Computer-Betriebssystemen“. Das ist ziemlich genau. Im Grunde führt Cron alle Hintergrundaufgaben aus, die wir zum Ausführen von Webdiensten benötigen, von der Protokollverwaltung und Sicherungen über API-Anfragen bis hin zur Datenbankbereinigung.
Um vorhandene Cron-Jobs auf einem Server anzuzeigen, geben Sie normalerweise sudo crontab -l
ein und sehen etwa Folgendes:
# 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
Geben Sie links an, ob diese Aufgaben alle 3 oder 15 Minuten oder jeden Tag um Mitternacht usw. aktiviert werden sollen, und rechts befindet sich das auszuführende Skript. Siehe auchAufgaben mithilfe von Cron-Jobs planen (Envato Tuts+).
Bitte beachten Sie, dass das Let's Encrypt-Skript ein einzigartiger Konsolenbefehl ist. Es wird über die Befehlszeile auf unserem Server ausgeführt. Allerdings werden alle meine oben genannten Besprechungsplanaufgaben über wget ausgeführt. Es ist wie ein Bot, der zu einem bestimmten Zeitpunkt Anfragen im Webbrowser an unsere Webanwendung ausführt, die Hintergrundaufgaben ausführt.
Zusätzlich zum Overhead, der für externe Webanfragen und Timeout-Einschränkungen für Skripte auf dem Server erforderlich ist, müssen Sie diese Zugriffspunkte auch sichern. Hier ist ein Beispiel dafür, wie Tagungsplaner dies tun können:
// 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 }
Es überprüft, ob der Benutzer als Administrator angemeldet ist oder lokal auf dem Server mit derselben Internet-IP-Adresse ausgeführt wird.
Alex Makarov ist einer der wichtigsten Freiwilligen, die am Yii-Framework arbeiten, und er hilft mir bei der Beantwortung meiner Fragen, wenn ich regelmäßig über das Envato Tuts+-Framework schreibe. Nachdem er meinen Sicherheitsvorfall gelesen hatte, fragte er mich, warum ich nicht die native Konsolenfunktionalität von Yii2 verwendet habe, um Cron-Jobs auszuführen. Im Grunde weiß ich es nicht.
So wie ich eine /frontend/controllers/DaemonController.php hatte, habe ich eine /console/controllers/DaemonController.php erstellt. In diesem Tutorial werde ich dies für einen kleineren, einfacheren Twixxr-Webdienst tun.
Ich bin es gewohnt, die Konsole zum Ausführen von Datenbankmigrationen zu verwenden (wie ./yii migrate/up 7
), aber das ist auch schon alles. Ich würde gerne versuchen, damit Hintergrundaufgaben auszuführen.
Wie ich in einem früheren Tutorial geschrieben habe, erforderte meine entstehende Website Twixxr viele Hintergrundprozesse, um regelmäßig API-Aufrufe zu rotieren, um alle Benutzeranfragen zu erfüllen, mit Twitter-Konten weiblicher Influencer in Kontakt zu treten.
Die Homepage lautet wie folgt:
Also dachte ich, Twixxr wäre eine gute Testplattform für die Ausführung konsolenbasierter Cron-Controller.
Dies ist der Kern meines neuen konsolenbasierten 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 } }
Bitte beachten Sie, dass er in seiner Struktur meinem Front-End-basierten Controller sehr ähnlich ist, allerdings ist er nicht sicher über das Netzwerk zugänglich, da er sich im /console-Baum befindet. Die Apache-Webserver-Site ist nicht zum Durchsuchen dieser Zone konfiguriert.
Im obigen Beispiel wird actionFrequent()
将每两到三分钟调用一次。它处理另一组 Twixxr 友谊请求。另一方面,actionQuarter()
also alle 15 Minuten aufgerufen und aktualisiert die Profilinformationen des Browserkontos. Sehen wir uns an, wie die Planung in einer Cron-Datei funktioniert.
Im Wesentlichen habe ich in meiner Crontab-Datei wget durch ein reines Linux-Skript ersetzt, wie oben für die Let's Encrypt-Erneuerung gezeigt.
Sie geben sudo crontab -e
进行编辑,或输入 -l
ein, um den Inhalt aufzulisten. Hier ist meine Twixxr-Cron-Datei:
$ 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 或查看我的讲师页面以获取更新。
Das obige ist der detaillierte Inhalt vonYii2-Programmierhandbuch: So führen Sie den Cron-Dienst aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!