PHP cron中的批處理
更新時(shí)間:2008年09月16日 10:41:35 作者:
如果 Web 應(yīng)用程序中的一個(gè)特性需要超過 1 秒或 2 秒才能完成,那么應(yīng)該怎么辦?需要某種離線處理解決方案。學(xué)習(xí)幾種對(duì) PHP 應(yīng)用程序中長(zhǎng)時(shí)間運(yùn)行的作業(yè)進(jìn)行離線服務(wù)的方法。
大型的連鎖店有一個(gè)大問題。每天,在每家商店會(huì)發(fā)生數(shù)千次交易。公司執(zhí)行官希望對(duì)這些數(shù)據(jù)進(jìn)行挖掘。哪些產(chǎn)品賣得好?哪些不好?有機(jī)產(chǎn)品在哪里賣得好?冰淇淋的銷售情況怎么樣?
為了捕捉這些數(shù)據(jù),組織必須將所有事務(wù)性數(shù)據(jù)裝載進(jìn)一個(gè)數(shù)據(jù)模型,以便更適合生成公司所需的報(bào)告類型。但是,這很花費(fèi)時(shí)間,而且隨著連鎖規(guī)模的增長(zhǎng),處理一天的數(shù)據(jù)可能要花費(fèi)一天以上的時(shí)間。因此,這是個(gè)大問題。
現(xiàn)在,您的 Web 應(yīng)用程序可能不需要處理這么多數(shù)據(jù),但是任何站點(diǎn)的處理時(shí)間都有可能超過客戶愿意等待的時(shí)間。一般來說,客戶愿意等待的時(shí)間是 200 毫秒,如果超過這個(gè)時(shí)間,客戶就會(huì)覺得過程 “緩慢”。這個(gè)數(shù)字基于桌面應(yīng)用程序,而 Web 使我們更有耐心了。但無論如何,不應(yīng)該讓客戶等待的時(shí)間超過幾秒。所以,要采用一些策略來處理 PHP 中的批處理作業(yè)。
分散的方式與 cron
在 UNIX® 機(jī)器上,執(zhí)行批處理的核心程序是 cron 守護(hù)進(jìn)程。這個(gè)守護(hù)進(jìn)程讀取一個(gè)配置文件,這個(gè)文件會(huì)告訴它要運(yùn)行哪些命令行以及運(yùn)行的頻率。然后,這個(gè)守護(hù)進(jìn)程就按照配置執(zhí)行它們。在遇到錯(cuò)誤時(shí),它甚至能夠向指定的電子郵件地址發(fā)送錯(cuò)誤輸出,從而幫助對(duì)問題進(jìn)行調(diào)試。
我知道一些工程師強(qiáng)烈主張使用線程技術(shù)?!熬€程!線程才是進(jìn)行后臺(tái)處理的真正方法。cron 守護(hù)進(jìn)程太過時(shí)了。”
我不這么認(rèn)為。
這兩種方法我都用過,我認(rèn)為 cron 具備 “Keep It Simple, Stupid(KISS,簡(jiǎn)單就是美)” 原則的優(yōu)點(diǎn)。它使后臺(tái)處理保持簡(jiǎn)單。不需要編寫一直運(yùn)行的多線程的作業(yè)處理應(yīng)用程序(因此不會(huì)有內(nèi)存泄漏),而是由 cron 啟動(dòng)一個(gè)簡(jiǎn)單的批處理腳本。這個(gè)腳本判斷是否有作業(yè)要處理,執(zhí)行作業(yè),然后退出。不需要擔(dān)心內(nèi)存泄漏。也不需要擔(dān)心線程停止或陷入無限循環(huán)。
那么,cron 是如何工作的?這依賴于您所處的系統(tǒng)環(huán)境。我只討論老式簡(jiǎn)單的 cron 的 UNIX 命令行版本,您可以向系統(tǒng)管理員咨詢?nèi)绾卧谧约旱?Web 應(yīng)用程序中實(shí)現(xiàn)它。
下面是一個(gè)簡(jiǎn)單的 cron 配置,它在每天晚上 11 點(diǎn)運(yùn)行一個(gè) PHP 腳本:
0 23 * * * jack /usr/bin/php /users/home/jack/myscript.php
前 5 個(gè)字段定義應(yīng)該啟動(dòng)腳本的時(shí)間。然后是應(yīng)該用來運(yùn)行這個(gè)腳本的用戶名。其余的命令是要執(zhí)行的命令行。時(shí)間字段分別是分、小時(shí)、月中的日、月和周中的日。下面是幾個(gè)示例。
命令:
15 * * * * jack /usr/bin/php /users/home/jack/myscript.php
在每個(gè)小時(shí)的第 15 分鐘運(yùn)行腳本。
命令:
15,45 * * * * jack /usr/bin/php /users/home/jack/myscript.php
在每個(gè)小時(shí)的第 15 和第 45 分鐘運(yùn)行腳本。
命令:
*/1 3-23 * * * jack /usr/bin/php /users/home/jack/myscript.php
在早上 3 點(diǎn)到晚上 11 點(diǎn)之間的每分鐘運(yùn)行腳本。
命令
30 23 * * 6 jack /usr/bin/php /users/home/jack/myscript.php
在每星期六的晚上 11:30 運(yùn)行腳本(星期六由 6 指定)。
可以看到,組合的數(shù)量是無限的??梢愿鶕?jù)需要控制運(yùn)行腳本的時(shí)間。還可以指定多個(gè)要運(yùn)行的腳本,這樣的話,一些腳本可以每分鐘都運(yùn)行,而其他腳本(比如備份腳本)可以每天只運(yùn)行一次。
為了指定將報(bào)告的錯(cuò)誤發(fā)送到哪個(gè)電子郵件地址,可以使用 MAILTO 指令,如下所示:
MAILTO=jherr@pobox.com
注意:對(duì)于 Microsoft® Windows® 用戶,有一個(gè)等效的 Scheduled Tasks 系統(tǒng)可以用來定期啟動(dòng)命令行進(jìn)程(比如 PHP 腳本)。
為了捕捉這些數(shù)據(jù),組織必須將所有事務(wù)性數(shù)據(jù)裝載進(jìn)一個(gè)數(shù)據(jù)模型,以便更適合生成公司所需的報(bào)告類型。但是,這很花費(fèi)時(shí)間,而且隨著連鎖規(guī)模的增長(zhǎng),處理一天的數(shù)據(jù)可能要花費(fèi)一天以上的時(shí)間。因此,這是個(gè)大問題。
現(xiàn)在,您的 Web 應(yīng)用程序可能不需要處理這么多數(shù)據(jù),但是任何站點(diǎn)的處理時(shí)間都有可能超過客戶愿意等待的時(shí)間。一般來說,客戶愿意等待的時(shí)間是 200 毫秒,如果超過這個(gè)時(shí)間,客戶就會(huì)覺得過程 “緩慢”。這個(gè)數(shù)字基于桌面應(yīng)用程序,而 Web 使我們更有耐心了。但無論如何,不應(yīng)該讓客戶等待的時(shí)間超過幾秒。所以,要采用一些策略來處理 PHP 中的批處理作業(yè)。
分散的方式與 cron
在 UNIX® 機(jī)器上,執(zhí)行批處理的核心程序是 cron 守護(hù)進(jìn)程。這個(gè)守護(hù)進(jìn)程讀取一個(gè)配置文件,這個(gè)文件會(huì)告訴它要運(yùn)行哪些命令行以及運(yùn)行的頻率。然后,這個(gè)守護(hù)進(jìn)程就按照配置執(zhí)行它們。在遇到錯(cuò)誤時(shí),它甚至能夠向指定的電子郵件地址發(fā)送錯(cuò)誤輸出,從而幫助對(duì)問題進(jìn)行調(diào)試。
我知道一些工程師強(qiáng)烈主張使用線程技術(shù)?!熬€程!線程才是進(jìn)行后臺(tái)處理的真正方法。cron 守護(hù)進(jìn)程太過時(shí)了。”
我不這么認(rèn)為。
這兩種方法我都用過,我認(rèn)為 cron 具備 “Keep It Simple, Stupid(KISS,簡(jiǎn)單就是美)” 原則的優(yōu)點(diǎn)。它使后臺(tái)處理保持簡(jiǎn)單。不需要編寫一直運(yùn)行的多線程的作業(yè)處理應(yīng)用程序(因此不會(huì)有內(nèi)存泄漏),而是由 cron 啟動(dòng)一個(gè)簡(jiǎn)單的批處理腳本。這個(gè)腳本判斷是否有作業(yè)要處理,執(zhí)行作業(yè),然后退出。不需要擔(dān)心內(nèi)存泄漏。也不需要擔(dān)心線程停止或陷入無限循環(huán)。
那么,cron 是如何工作的?這依賴于您所處的系統(tǒng)環(huán)境。我只討論老式簡(jiǎn)單的 cron 的 UNIX 命令行版本,您可以向系統(tǒng)管理員咨詢?nèi)绾卧谧约旱?Web 應(yīng)用程序中實(shí)現(xiàn)它。
下面是一個(gè)簡(jiǎn)單的 cron 配置,它在每天晚上 11 點(diǎn)運(yùn)行一個(gè) PHP 腳本:
0 23 * * * jack /usr/bin/php /users/home/jack/myscript.php
前 5 個(gè)字段定義應(yīng)該啟動(dòng)腳本的時(shí)間。然后是應(yīng)該用來運(yùn)行這個(gè)腳本的用戶名。其余的命令是要執(zhí)行的命令行。時(shí)間字段分別是分、小時(shí)、月中的日、月和周中的日。下面是幾個(gè)示例。
命令:
15 * * * * jack /usr/bin/php /users/home/jack/myscript.php
在每個(gè)小時(shí)的第 15 分鐘運(yùn)行腳本。
命令:
15,45 * * * * jack /usr/bin/php /users/home/jack/myscript.php
在每個(gè)小時(shí)的第 15 和第 45 分鐘運(yùn)行腳本。
命令:
*/1 3-23 * * * jack /usr/bin/php /users/home/jack/myscript.php
在早上 3 點(diǎn)到晚上 11 點(diǎn)之間的每分鐘運(yùn)行腳本。
命令
30 23 * * 6 jack /usr/bin/php /users/home/jack/myscript.php
在每星期六的晚上 11:30 運(yùn)行腳本(星期六由 6 指定)。
可以看到,組合的數(shù)量是無限的??梢愿鶕?jù)需要控制運(yùn)行腳本的時(shí)間。還可以指定多個(gè)要運(yùn)行的腳本,這樣的話,一些腳本可以每分鐘都運(yùn)行,而其他腳本(比如備份腳本)可以每天只運(yùn)行一次。
為了指定將報(bào)告的錯(cuò)誤發(fā)送到哪個(gè)電子郵件地址,可以使用 MAILTO 指令,如下所示:
MAILTO=jherr@pobox.com
注意:對(duì)于 Microsoft® Windows® 用戶,有一個(gè)等效的 Scheduled Tasks 系統(tǒng)可以用來定期啟動(dòng)命令行進(jìn)程(比如 PHP 腳本)。
您可能感興趣的文章:
- linux下使用crontab實(shí)現(xiàn)定時(shí)PHP計(jì)劃任務(wù)失敗的原因分析
- linux使用crontab實(shí)現(xiàn)PHP執(zhí)行計(jì)劃定時(shí)任務(wù)
- linux實(shí)現(xiàn)php定時(shí)執(zhí)行cron任務(wù)詳解
- 解析crontab php自動(dòng)運(yùn)行的方法
- 如何使用Linux的Crontab定時(shí)執(zhí)行PHP腳本的方法
- PHP框架Swoole定時(shí)器Timer特性分析
- PHP針對(duì)常規(guī)模板引擎中與CSS/JSON沖突的解決方法
- php解析json數(shù)據(jù)實(shí)例
- php版本的cron定時(shí)任務(wù)執(zhí)行器使用實(shí)例
相關(guān)文章
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence錯(cuò)誤的處理方法
在利用php解析xml時(shí)提示Invalid byte 1 of 1-byte UTF-8 sequence錯(cuò)誤了,這個(gè)問題我百度查實(shí)說是編碼問題,結(jié)果我把編碼處理一下果然KO了,下面我來分享一下解決辦法2013-11-11
php 調(diào)用ffmpeg獲取視頻信息的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猵hp 調(diào)用ffmpeg獲取視頻信息的簡(jiǎn)單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
PHP正則匹配日期和時(shí)間(時(shí)間戳轉(zhuǎn)換)的實(shí)例代碼
本文介紹下,用php實(shí)現(xiàn)正則匹配日期與時(shí)間,并進(jìn)行時(shí)間戳轉(zhuǎn)換的例子,有需要的朋友,參考下吧2016-12-12
簡(jiǎn)單的方法讓你的后臺(tái)登錄更加安全(php中加session驗(yàn)證)
通過特定文件為后臺(tái)入口注冊(cè)session,否則失敗退出。即直接使用原后臺(tái)地址將無法登錄后臺(tái)。這樣一來,入口文件名的多樣性、可變更性將為你的后臺(tái)登錄提供更加安全的環(huán)境2012-08-08
PHP動(dòng)態(tài)編譯出現(xiàn)Cannot find autoconf的解決方法
這篇文章主要介紹了PHP動(dòng)態(tài)編譯出現(xiàn)Cannot find autoconf的解決方法,是PHP程序設(shè)計(jì)中經(jīng)常會(huì)遇到的問題,需要的朋友可以參考下2014-11-11

