目錄
#什麼是 Cron?
實作基於控制台的 Cron 指令
新的 DaemonController.php
新的 crontab 檔案
需要考虑的问题
下一步是什么
相关链接
首頁 後端開發 php教程 Yii2程式設計指南:執行Cron服務的方法

Yii2程式設計指南:執行Cron服務的方法

Sep 01, 2023 pm 11:21 PM
yii 程式設計指南 cron服務

Yii2程式設計指南:執行Cron服務的方法

如果您問「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?

維基百科將 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 位址在伺服器上本機執行。

實作基於控制台的 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 帳戶交友。

主頁如下所示:

Yii2程式設計指南:執行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 列出其內容。這是我的 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 Developer Exchange,我的 Yii2 资源站点
  • 使用 Cron 作业安排任务 (Envato Tuts+)

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

以上是Yii2程式設計指南:執行Cron服務的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用PHP框架Yii開發一個高可用的雲端備份系統 如何使用PHP框架Yii開發一個高可用的雲端備份系統 Jun 27, 2023 am 09:04 AM

隨著雲端運算技術的不斷發展,資料的備份已經成為了每個企業必須要做的事情。在這樣的背景下,開發一款高可用的雲端備份系統尤其重要。而PHP框架Yii是一款功能強大的框架,可以幫助開發者快速建立高效能的Web應用程式。以下將介紹如何使用Yii框架開發一款高可用的雲端備份系統。設計資料庫模型在Yii框架中,資料庫模型是非常重要的一環。因為資料備份系統需要用到很多的表和關

全角半角切換快捷鍵使用指南 全角半角切換快捷鍵使用指南 Mar 26, 2024 am 09:30 AM

全角半角切換快速鍵使用指南全角和半角是中文輸入法中常用的兩種狀態,全角狀態下一個字元佔據一個字元的位置,而半角狀態下一個字元佔據半個字元的位置。在日常的文字處理中經常需要用到全角和半角的切換,而掌握快捷鍵可以提高工作效率。本文將為大家介紹全角半角切換的快速鍵使用指南。一、Windows系統下的全角半角切換在Windows系統下切換全角與半角狀態,通常使用下列

Symfony vs Yii2:哪個框架比較適合開發大型Web應用? Symfony vs Yii2:哪個框架比較適合開發大型Web應用? Jun 19, 2023 am 10:57 AM

隨著Web應用需求的不斷增長,開發者在選擇開發框架方面也越來越有選擇的空間。 Symfony和Yii2是兩個備受歡迎的PHP框架,它們都具有強大的功能和效能,但在面對需要開發大型網路應用程式時,哪個框架更適合呢?接下來我們將對Symphony和Yii2進行比較分析,以幫助你更好地進行選擇。基本概述Symphony是一個由PHP編寫的開源Web應用框架,它是建立

Yii框架中的資料查詢:有效率地存取數據 Yii框架中的資料查詢:有效率地存取數據 Jun 21, 2023 am 11:22 AM

Yii框架是一個開源的PHPWeb應用程式框架,提供了眾多的工具和元件,簡化了Web應用程式開發的流程,其中資料查詢是其中一個重要的元件之一。在Yii框架中,我們可以使用類似SQL的語法來存取資料庫,從而有效率地查詢和操作資料。 Yii框架的查詢建構器主要包括以下幾種類型:ActiveRecord查詢、QueryBuilder查詢、命令查詢和原始SQL查詢

php如何使用Yii3框架? php如何使用Yii3框架? May 31, 2023 pm 10:42 PM

隨著互聯網的不斷發展,Web應用程式開發的需求也越來越高。對於開發人員而言,開發應用程式需要一個穩定、高效、強大的框架,這樣可以提高開發效率。 Yii是一款領先的高效能PHP框架,它提供了豐富的特性和良好的性能。 Yii3是Yii框架的下一代版本,它在Yii2的基礎上進一步優化了效能和程式碼品質。在這篇文章中,我們將介紹如何使用Yii3框架來開發PHP應用程式。

Yii2 vs Phalcon:哪個框架更適合開發顯示卡渲染應用? Yii2 vs Phalcon:哪個框架更適合開發顯示卡渲染應用? Jun 19, 2023 am 08:09 AM

在當前資訊時代,大數據、人工智慧、雲端運算等技術已成為了各大企業關注的熱點。在這些技術中,顯示卡渲染技術作為一種高效能圖形處理技術,受到了越來越多的關注。顯示卡渲染技術廣泛應用於遊戲開發、影視特效、工程建模等領域。而對於開發者來說,選擇一個適合自己專案的框架,是一個非常重要的決策。在目前的語言中,PHP是一種相當有活力的語言,一些優秀的PHP框架如Yii2、Ph

PHP日期程式設計指南:探索如何使用PHP來確定某個日期的星期幾 PHP日期程式設計指南:探索如何使用PHP來確定某個日期的星期幾 Mar 19, 2024 pm 06:09 PM

PHP日期程式設計指南:探索如何使用PHP確定某個日期的星期幾在PHP程式設計中,經常需要處理日期和時間相關的問題,其中一個常見的需求就是確定某個日期是星期幾。 PHP提供了豐富的日期和時間處理函數,可以輕鬆實現這項功能。本文將詳細介紹如何在PHP中確定某個日期的星期幾,並給出具體的程式碼範例。 1.使用date()函數取得星期幾PHP中的date()函數可以用來格式化

Go語言程式設計入門指南 Go語言程式設計入門指南 Mar 25, 2024 am 09:30 AM

Go語言(Golang)是由Google開發的一種程式語言,它的設計簡潔、高效,並且具有很強的並發特性,因此受到了許多開發者的青睞。本文將為您提供一份簡單的Go語言程式設計入門指南,介紹基本的概念和語法,並附上具體的程式碼範例來幫助您更好地了解和學習Go語言程式設計。環境建構和配置第一步是建構Go語言的開發環境。您可以在Go官網(https://golang.org/)

See all articles