2013-10-03 90 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