2013-10-03 88 views
5

我需要執行一個刮板的網站和發送電子郵件與信息的cron作業,我做了一個控制器要做到這一點,但是當我設置了命令來運行該文件cron作業在Laravel 4

 
php app/controllers/ScraperController.php 

我得到這個錯誤

PHP Fatal error: Class 'BaseController' not found in /var/www/U-Scraper/app/controllers/ScraperController.php on line 2

的事情是,它工作時,我成立了以該控制器

+0

最好的方法是製作路徑rulls並使用http請求運行cronjobs。 – vinsa

回答

10

控制器本身不經營的路線,他們爲Laravel的組件工作。如果你直接加載你的控制器,那麼Laravel不會被加載,並且就PHP而言,BaseController以及Laravel的Controller類不存在。通常你的web服務器會加載public/index.php,這會加載Laravel等等。如果這很讓人困惑,您可能想了解如何使用Composer自動加載作品:http://net.tutsplus.com/tutorials/php/easy-package-management-with-composer/

您應該做的是write an Artisan command,它可以滿足您的需求並使用cron調用該命令。這個問題給出瞭如何做到這一點的細節:Cron Job in Laravel

+0

或者,您也可以使用setcronjob + iron.io推送隊列等服務。我在沒有crontab訪問權限的生產服務器中使用它。 – Arda

+0

@Arda你能解釋一下這個方法嗎?有關於此的任何信息?我從未理解鐵的目的。 – itachi

+1

@itachi想這樣:在我的例子中,iron.io做的是去請求並等待你完成。您向setcronjob發出conjob請求,在該時間,cronjob服務觸發隊列引擎,隊列引擎向您的操作發出推式請求,並等待它完成。 Cronjob服務也可以等待(如果我正確記得,setcronjob只能等待15秒),但是您的請求可能需要更長時間(想象一些類似羣發郵件的遠程SMTP服務等,並向1000個人發送電子郵件),所以排隊帶來在這裏受益。 – Arda

3

我建議你創建新的Artisan命令而不是控制器。

然後設置定期任務運行命令,例如:

1 * * * * /usr/bin/php /path/to/the/artisan nameofthecustomcommand 

如果您不能運行/設置任務這樣,但你可以設置URL執行

http://mydomain.com/cron.php 

// cron.php 
// I am aware I do use exec() 
exec('php artisan nameofthecustomcommand'); 

更多工匠命令here

有一個機會,你可以把整個控制器的方法放入這個命令而不必觸摸代碼;)

+0

我同意,創建artisan命令可能是最好的,但在某些情況下,可以使用LYNX命令的CRON - 特別是如果您希望選項也可以從瀏覽器運行相同的任務。 – Snapey

0

這是我使用Laravel 4和Artisan Command功能設置CRON作業的方式。

首先,使用Artisan創建一個新命令。在命令行中輸入:

php artisan command:make FooCommand

在你app/commands文件夾你現在會有一個叫做FooCommand.php新文件。

打開該文件並在函數fire()中寫入代碼。每次運行命令時都會運行。還有一些其他功能允許您從命令行捕獲參數和選項。

在您的命令文件中還有$name$description變量需要填寫。給你的任務,一個漂亮的名稱和說明,如:

/** 
* The console command name. 
* 
* @var string 
*/ 
protected $name = 'command:my_foo_command'; 

/** 
* The console command description. 
* 
* @var string 
*/ 
protected $description = 'A description of what the command does'; 

一旦你完成,你需要通過開放app/start/artisan.php,並增加其註冊到工匠:

Artisan::add(new FooCommand);

然後在使用Artisan命令行你可以運行你的任務使用:

php artisan command:my_foo_command 

這將只會調用一次命令 - 讓它運行在一個gular basis將以下內容添加到您的CRONTAB中:

1 * * * * /usr/bin/php /path/to/the/artisan command:my_foo_command 
+0

我在我的終端'php artisan cronjob:execute'中執行此操作,但它給了我錯誤runtimeException ..沒有足夠的參數.. –

+0

要在終端中運行命令,您需要運行'php artisan command:my_foo_command '。 'my_foo_command'是您在命令文件中設置的命令的名稱。 – ajtrichards