【问题标题】:A Cron Job in Laravel 4Laravel 4 中的 Cron 作业
【发布时间】:2013-10-09 14:45:54
【问题描述】:

我需要一个 Cron 作业来执行 Scraper 到网站并发送包含信息的电子邮件,我创建了一个控制器来执行此操作,但是当我设置命令来运行该文件时

php 应用程序/控制器/ScraperController.php

我收到这个错误

PHP 致命错误:在中找不到类“BaseController” /var/www/U-Scraper/app/controllers/ScraperController.php 在第 2 行

问题是,当我设置到该控制器的路由时它可以工作

【问题讨论】:

  • 最好的方法是制定路由规则并使用 http 请求运行 cronjobs。

标签: php cron laravel


【解决方案1】:

控制器不是自己运行的,它们是 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

【讨论】:

  • 另外,您也可以使用 setcronjob + iron.io 推送队列之类的服务。我在无法访问 crontab 的生产服务器中使用它。
  • @Arda 你能稍微解释一下这种方法吗?有任何相关信息吗?我一直不明白铁的用途。
  • @itachi 可以这样想:在我的示例中,iron.io 所做的是发送请求并等待您完成。您向 setcronjob 发出 conjob 请求,此时,cronjob 服务触发队列引擎,队列引擎向您的操作发出推送请求并等待它完成。 Cronjob 服务也可以等待(如果我没记错的话,setcronjob 只能等待 15 秒),但是您的请求可能需要更长的时间(想象一下使用远程 SMTP 服务等进行大量电子邮件发送以及向 1000 个人发送电子邮件),所以排队会带来受益于此。
【解决方案2】:

我建议你创建新的 Artisan 命令而不是控制器。

然后设置 CRON 任务来运行你的命令,例如:

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');

更多关于 Artisan 命令here

有机会,您可以将整个控制器方法放入此命令中,而无需接触代码;)

【讨论】:

  • 我同意,创建 artisan 命令可能是最好的,但在某些情况下可以使用 LYNX 命令的 CRON - 特别是如果您希望该选项也可以从浏览器运行相同的任务。跨度>
【解决方案3】:

这是我使用 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:

Artisan::add(new FooCommand);

然后在命令行中使用 Artisan,您可以使用以下命令运行您的任务:

php artisan command:my_foo_command

这只会调用一次命令 - 要让它定期运行,请将以下内容添加到您的 CRONTAB:

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

【讨论】:

  • 我在我的终端“php artisan cronjob:execute”中执行此操作,但它给了我错误 runtimeException.. 没有足够的参数..
  • 要在终端中运行命令,您需要运行 php artisan command:my_foo_commandmy_foo_command 是您在命令文件中设置的命令的名称。
猜你喜欢
  • 2013-01-09
  • 2015-04-19
  • 1970-01-01
  • 2013-04-28
  • 2013-12-08
  • 2018-10-24
  • 2019-11-04
  • 2016-01-09
  • 1970-01-01
相关资源
最近更新 更多