2013-11-04 22 views
1

我在zend framework 2中有兩個函數,它將我從另一個站點獲取的公寓細節存入我的數據庫中。 (但他們只有在我運行這些功能時才這樣做)。如何在zendframework 2中使用cron作業?

表示控制器名稱是'FetchFromSourceController',函數是'index'和'ical'。那些是我用過的名字。

但我的要求是,這兩個函數應該自動運行一個接一個的一天開始,差距爲10分鐘。即索引行動應該在凌晨12點運行,而行動應該在每天凌晨12點10分運行。

我聽說我可以使用'cron job'來達到這個目的,但從來沒有使用過。請告訴我在ZF2中編寫cron作業代碼的位置,以便在特定時間運行這些功能。

或atleast給我一些在zendframework2中使用cron作業的教程。我搜索了它,但沒有找到任何。提前致謝。

回答

2

ZF2沒有一個「cron作業」的服務,在特定的時間自動運行的腳本。

Cron作業是在特定時間執行的任務,通常在操作系統級別設置。在unix中,它通過crontab完成,在windows中你可以使用任務調度器。 ZF2沒有任何東西可以在12點和12點10分執行你的腳本。

選項#1:通過管理面板

對於大多數主機環境定時任務,你可以設置通過您的網站託管管理面板(如的Plesk或cPanel)進行了「cron作業」。您可以通過輸入時間和要運行的命令來安排工作。以這種方式創建cron作業時,請記住,您將輸入要通過命令行運行的命令。通常這是直接調用php來執行特定的腳本,但你也可以使用wget來從互聯網上獲取任何URL。如果你直接調用php,你需要按照Zdenek的答案設置一個控制檯路由。

/usr/bin/php /path/to/zf2/public/index.php myIndexConsoleRoute 

wget http://yoursite.com/fetch-from-source/index 

選項2:通過命令行設置的crontab

或者,如果你有你的服務器命令行訪問和正確的用戶權限,您可以設置每個Zdenek的答案通過命令行一個crontab。還有相關信息here。這通常是首選的方法,但在我看來,它更具有參與性,對於設置和調試可能是一個挑戰,特別是如果您對Unix沒有經驗。

選項#3:計劃作業服務 如果你正在尋找一個簡單的解決方案,你可以考慮的cron的服務在那裏,這將在特定時間加載一個特定的網址之一。

舉例來說,我已經在過去使用這項服務: https://www.setcronjob.com

您創建帳戶後,您只需輸入一個URL,並選擇時間,你想被稱爲URL。通過設置兩個工作,一個在12:00運行,另一個在12:10運行,你可以很容易地完成你的要求,在12:00中調用indexAction,在12:10中調用icalAction。 SetCronjob有一個免費的計劃,可能適合您的需求,但請注意,他們要求您每隔30天輸入一次驗證碼以更新您的免費帳戶(這很好,但一段時間後會變得令人討厭)。

在選項#1網址VS命令行

隨着 「wget的」 和Cron服務的選項#3,你需要讓你的indexAction和icalAction通過HTTP可用。這可能是一個重要的考慮因素。即使您添加了某種驗證(通過檢查您通過查詢字符串或帖子發送的代碼),如果互聯網上的任何人知道正確的「祕密」URL,仍可能觸發這些功能。如果要手動運行這些腳本來強制更新,讓您通過http訪問ical和index方法還有另一個好處,即可以輕鬆地調用它們。

使用Zdenek提到的CLI方法,您可以在ZF2中創建一個控制檯路由,並且唯一的方法是通過命令行來觸發該路由。這通常是首選,因爲您的索引和專業方法不會暴露給http,但根據您的託管設置,它並不總是一個選項,它可能不是一個重要的關注點,這取決於這些功能對您的數據和公共網站的作用。

+0

BPosey, 感謝您的詳細解釋。實際上,我在Admin模塊中的控制器中有這些Actions(index和ical),這意味着這些文件需要驗證才能運行。如果我在站點中提供了像http://www.eveparis.com/admin/add-from-source/index 和http://www.eveparis.com/admin/add-from-source/ical 這樣的網址, https://www.setcronjob.com,它工作?由於要手動運行這些文件,因此需要驗證。 – raghuveer999

+1

據我所知,SetCronjob支持的唯一身份驗證類型是[HTTP基本身份驗證](https://www.setcronjob.com/faq#question-features-can-i-include-username-and-password-在-MY-URL的基本-HTTP認證)。我懷疑你的管理員有一個正確的登錄頁面,需要一個電子郵件/密碼,這意味着你需要開發自己的解決方案,使SetCronjob可以訪問這些功能。也許你可以創建一個不需要身份驗證的CronController,並在那裏移動你的索引和ical函數? – BPosey

+0

是在另一個模塊中創建另一個控制器是一個好主意。感謝您的幫助 – raghuveer999

4

隨着ZF2您可以通過命令行訪問的命令行控制器動作,它的作品真的很好。 所有你所要做的就是添加路由module.config.php

return array(
    ...... 
'console' => array(
    'router' => array(
     'routes' => array(
      'synch' => array(
       'options' => array(
        'route' => 'synch (sites|items):task', 
        'defaults' => array(
         'controller' => 'Application\Controller\Scheduled', 
         'action'  => 'synch' 
        ) 
       ) 
      ), 
), 

正如你可以看到它調用應用程序\控制器\定時控制器,同步行動,有

public function synchAction() 
{ 
    $task = $this->params('task'); 
    try{ 
     switch($task){ 
      case 'sites': 
        ....... 
      break; 
      case 'items': 
        ....... 
      break; 
     } 

然後你可以創建簡單的shell腳本zf2.sh

php /var/www/vhosts/mysite/httpdocs/public/index.php $1 $2 

,並添加的crontab

0 6 * * * /home/admin/scripts/zf2.sh synch sites 

或只是運行命令行

./zf2.sh synch items