Heim > Backend-Entwicklung > PHP-Tutorial > Yii2-Programmierhandbuch: So führen Sie den Cron-Dienst aus

Yii2-Programmierhandbuch: So führen Sie den Cron-Dienst aus

WBOY
Freigeben: 2023-09-02 06:00:01
Original
1041 Leute haben es durchsucht

Yii2-Programmierhandbuch: So führen Sie den Cron-Dienst aus

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.

Was ist Cron?

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
Nach dem Login kopieren

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
    }
Nach dem Login kopieren

Es überprüft, ob der Benutzer als Administrator angemeldet ist oder lokal auf dem Server mit derselben Internet-IP-Adresse ausgeführt wird.

Konsolenbasierten Cron-Befehl implementieren

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:

Yii2-Programmierhandbuch: So führen Sie den Cron-Dienst aus

Also dachte ich, Twixxr wäre eine gute Testplattform für die Ausführung konsolenbasierter Cron-Controller.

Neuer DaemonController.php

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
          }
      	}
Nach dem Login kopieren

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.

Neue Crontab-Datei

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
Nach dem Login kopieren

这非常简单。 /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 Developer Exchange,我的 Yii2 资源站点
  • 使用 Cron 作业安排任务 (Envato Tuts+)

  • 如何在 Yii2 中实现 cron(Yii 文档)
  • Twixxr,其中提到的示例网络服务

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage