Dalam siri Pengaturcaraan dengan Yii2 ini, saya akan membimbing pembaca menggunakan rangka kerja Yii2PHP. Dalam tutorial hari ini, saya akan berkongsi dengan anda cara memanfaatkan fungsi konsol Yii untuk menjalankan kerja cron. Pada masa lalu, saya telah menggunakan wget - URL yang boleh diakses web - dalam tugas cron untuk menjalankan tugas latar belakang saya. Ini menimbulkan kebimbangan keselamatan dan mempunyai beberapa masalah prestasi. Semasa saya membincangkan beberapa cara untuk mengurangkan risiko dalam siri Keselamatan untuk Permulaan kami, saya berharap untuk beralih kepada arahan yang dipacu konsol"/> Dalam siri Pengaturcaraan dengan Yii2 ini, saya akan membimbing pembaca menggunakan rangka kerja Yii2PHP. Dalam tutorial hari ini, saya akan berkongsi dengan anda cara memanfaatkan fungsi konsol Yii untuk menjalankan kerja cron. Pada masa lalu, saya telah menggunakan wget - URL yang boleh diakses web - dalam tugas cron untuk menjalankan tugas latar belakang saya. Ini menimbulkan kebimbangan keselamatan dan mempunyai beberapa masalah prestasi. Semasa saya membincangkan beberapa cara untuk mengurangkan risiko dalam siri Keselamatan untuk Permulaan kami, saya berharap untuk beralih kepada arahan yang dipacu konsol">

Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Panduan Pengaturcaraan Yii2: Kaedah Menjalankan Perkhidmatan Cron

Panduan Pengaturcaraan Yii2: Kaedah Menjalankan Perkhidmatan Cron

WBOY
WBOYasal
2023-09-01 23:21:06985semak imbas

Panduan Pengaturcaraan Yii2: Kaedah Menjalankan Perkhidmatan Cron

Jika anda bertanya "Apakah Yii?", lihat tutorial saya sebelum ini: Pengenalan Rangka Kerja Yii yang meninjau faedah Yii , Ia juga menyediakan gambaran keseluruhan ciri baharu Yii 2.0 yang dikeluarkan pada Oktober 2014. Yeah>

Dalam siri Pengaturcaraan dengan Yii2 ini, saya akan membimbing pembaca menggunakan rangka kerja PHP Yii2. Dalam tutorial hari ini, saya akan berkongsi dengan anda cara memanfaatkan fungsi konsol Yii untuk menjalankan tugas cron.

Pada masa lalu, saya menggunakan wget — URL yang boleh diakses web — dalam tugas cron untuk menjalankan tugas latar belakang saya. Ini menimbulkan kebimbangan keselamatan dan mempunyai beberapa masalah prestasi. Semasa saya membincangkan beberapa cara untuk mengurangkan risiko dalam ciri keselamatan Siri Boot kami, saya berharap untuk beralih kepada arahan dipacu konsol. Dengan Yii2 ini agak mudah.

Untuk contoh hari ini, saya akan menunjukkan arahan cron berasaskan konsol pada tapak Twixxr saya, yang saya terangkan dalam episod API Twitter ini. Disebabkan oleh isu pengehadan kadar dan pengurusan prestasi, API Twitter sangat bergantung pada pekerjaan cron yang cekap dan boleh dipercayai. Jadi ini adalah contoh yang bagus untuk dikongsi dengan anda.

Sebelum saya bermula, saya ingin mengulangi: Saya sentiasa menghargai pendapat dan maklum balas anda. Jika anda mempunyai soalan atau cadangan topik, sila siarkan pendapat anda dalam ulasan di bawah. Anda juga boleh menghubungi saya terus di Twitter @reifman.

Apakah itu Cron?

Wikipedia menerangkan cron sebagai "penjadual kerja berasaskan masa dalam sistem pengendalian komputer seperti Unix." Ini agak tepat. Pada asasnya, cron menjalankan semua tugas latar belakang yang kami perlukan untuk menjalankan perkhidmatan web, daripada pengurusan log dan sandaran kepada permintaan API kepada pembersihan pangkalan data.

Untuk melihat kerja cron sedia ada pada pelayan, anda biasanya menaip sudo crontab -l dan lihat sesuatu seperti ini: 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 地址在服务器上本地运行。

实现基于控制台的 Cron 命令

Alex Makarov 是 Yii 框架开发的主要志愿者之一,当我定期撰写有关 Envato Tuts+ 框架的文章时,他帮助回答了我的问题。读完我的安全事件后,他问我为什么不使用 Yii2 固有的控制台功能来执行 cron 作业。基本上我不知道。

就像我有一个 /frontend/controllers/DaemonController.php 一样,我创建了一个 /console/controllers/DaemonController.php。在本教程中,我将为更小、更简单的 Twixxr Web 服务执行此操作。

我习惯使用控制台运行数据库迁移(例如 ./yii migrate/up 7),但仅此而已。我很想尝试使用它来执行后台任务。

正如我在之前的教程中所写的,我的新生网站 Twixxr 需要大量的后台进程来定期轮换 API 调用,以满足所有用户请求,以与女性拥有的有影响力的 Twitter 帐户交友。

主页如下所示:

Panduan Pengaturcaraan Yii2: Kaedah Menjalankan Perkhidmatan Cron

所以我认为 Twixxr 会成为运行基于控制台的 cron 控制器的一个很好的测试平台。

新的 DaemonController.php

这是我的新的基于控制台的 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 文件

本质上,在我的 crontab 文件中,我将 wget 替换为直接 Linux 脚本,如上所示,用于 Let's Encrypt 续订。

您输入 sudo crontab -e 进行编辑,或输入 -l

$ 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

Sebelah kiri menentukan untuk mengaktifkan tugasan ini setiap 3 atau 15 minit atau setiap hari pada tengah malam, dsb., dan sebelah kanan ialah skrip untuk dijalankan. #🎜🎜#Lihat juga #🎜🎜##🎜🎜#Menjadualkan tugas menggunakan kerja Cron (Envato Tuts+)#🎜🎜##🎜🎜#. #🎜🎜##🎜🎜# #🎜🎜#Sila ambil perhatian bahawa skrip Let's Encrypt ialah arahan konsol yang unik. Ia dijalankan dari baris arahan pada pelayan kami. Walau bagaimanapun, semua tugas jadual mesyuarat saya di atas dijalankan melalui wget. Ia seperti bot menjalankan permintaan pada penyemak imbas web pada masa tertentu terhadap aplikasi web kami yang melaksanakan tugas latar belakang. #🎜🎜# #🎜🎜# Sebagai tambahan kepada overhed yang diperlukan untuk permintaan web luaran dan kekangan tamat masa untuk skrip pada pelayan, anda juga mesti melindungi titik akses ini. Berikut ialah contoh cara perancang mesyuarat boleh melakukan perkara ini: #🎜🎜# rrreee #🎜🎜#Ia mengesahkan bahawa pengguna log masuk sebagai pentadbir atau sedang berjalan secara setempat pada pelayan dengan alamat IP Internet yang sama. #🎜🎜# #🎜🎜#Laksanakan arahan Cron berasaskan konsol#🎜🎜# #🎜🎜#Alex Makarov ialah salah seorang sukarelawan utama dalam pembangunan rangka kerja Yii dan dia membantu menjawab soalan saya apabila saya kerap menulis tentang rangka kerja Envato Tuts+. Selepas membaca insiden keselamatan saya, dia bertanya kepada saya mengapa saya tidak menggunakan fungsi konsol asli Yii2 untuk melaksanakan tugas cron. Pada dasarnya saya tidak tahu. #🎜🎜# #🎜🎜#Sama seperti saya mempunyai /frontend/controllers/DaemonController.php, saya mencipta /console/controllers/DaemonController.php. Dalam tutorial ini, saya akan melakukan ini untuk perkhidmatan web Twixxr yang lebih kecil dan lebih ringkas. #🎜🎜# #🎜🎜#Saya sudah biasa menggunakan konsol untuk menjalankan migrasi pangkalan data (cth ./yii migrate/up 7), tetapi itu sahaja. Saya ingin mencuba menggunakannya untuk melaksanakan tugas latar belakang. #🎜🎜# #🎜🎜#Seperti yang saya tulis dalam tutorial sebelumnya, tapak web saya yang baru lahir, Twixxr memerlukan sejumlah besar proses latar belakang untuk kerap memutarkan panggilan API untuk memenuhi semua permintaan pengguna untuk bersosial dengan akaun Twitter influencer milik wanita. #🎜🎜# #🎜🎜#Laman utama adalah seperti berikut: #🎜🎜# #🎜🎜#Panduan Pengaturcaraan Yii2: Kaedah menjalankan perkhidmatan Cron#🎜 🎜##🎜🎜#Jadi saya fikir Twixxr akan menjadi platform ujian yang baik untuk menjalankan pengawal cron berasaskan konsol. #🎜🎜#

DaemonController.php Baharu

#🎜🎜#Ini adalah teras DaemonController.php berasaskan konsol baharu saya: #🎜🎜# rrreee #🎜🎜#Sila ambil perhatian bahawa strukturnya sangat serupa dengan pengawal berasaskan bahagian hadapan saya, namun ia tidak boleh diakses dengan selamat melalui rangkaian kerana ia terletak di pepohon /console. Tapak pelayan web Apache tidak dikonfigurasikan untuk menyemak imbas zon ini. #🎜🎜# #🎜🎜#Jadi, dalam contoh di atas, actionFrequent() akan dipanggil setiap dua hingga tiga minit. Ia mengendalikan satu lagi set permintaan persahabatan Twixxr. Sebaliknya, actionQuarter() dipanggil setiap 15 minit dan mengemas kini maklumat profil akaun menyemak imbas. Mari lihat cara penjadualan berfungsi dalam fail cron. #🎜🎜#

Fail crontab baharu

#🎜🎜#Pada asasnya, dalam fail crontab saya, saya menggantikan wget dengan skrip Linux langsung seperti yang ditunjukkan di atas untuk pembaharuan Let's Encrypt. #🎜🎜# #🎜🎜#Anda masukkan sudo crontab -e untuk mengedit, atau -l untuk menyenaraikan kandungannya. Berikut ialah fail cron Twixxr saya: #🎜🎜#
$ 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 Developer Exchange,我的 Yii2 资源站点
  • 使用 Cron 作业安排任务 (Envato Tuts+)

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

Atas ialah kandungan terperinci Panduan Pengaturcaraan Yii2: Kaedah Menjalankan Perkhidmatan Cron. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn