【问题标题】:Cron Dispatcher CakePHP 2.0Cron 调度器 CakePHP 2.0
【发布时间】:2012-01-19 02:37:06
【问题描述】:

我正在使用 CakePHP 2.0 并且一直在尝试设置一个 cronjob 来在控制器中执行一个方法。我一直在发疯,查看各种教程和随机网站,看看我是否能找到解决方案。

我收到的错误是这样的:

Undefined variable: argc [APP/webroot/cron_dispatcher.php, line 83

这是我的 app/webroot/ 目录中 cron_dispatcher.php 文件的底部。

if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) {
        trigger_error("CakePHP core could not be found.  Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php.  It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR);
    }
    if (isset($_GET['url']) && $_GET['url'] === 'favicon.ico') {
    return;
    } else {
      define('CRON_DISPATCHER',true);
    if($argc >= 2) {
        $Dispatcher= new Dispatcher();
        $Dispatcher->dispatch($argv[1]);
        }
    }

我找不到这些变量($argv 和 $argc)的定义位置。它们没有在 dispatcher.php 文件本身的任何地方定义。我用谷歌搜索无济于事。我不能 100% 确定 Dispatcher 的工作原理,但我们将不胜感激任何帮助。谢谢。

== 更新 GoDaddy 的共享主机不允许您更改 argc argv 的设置。

【问题讨论】:

标签: php cakephp cron


【解决方案1】:

如果其他人有兴趣,

在新的 CakePHP 2.0.5 中,您将在 webroot 文件夹中创建一个 index.php:

复制此文件并将其命名为cron_dispatcher.php,并将其放入同一目录(webroot)

你会在最底部找到这段代码:

$Dispatcher = new Dispatcher();
$Dispatcher->dispatch(new CakeRequest(), new CakeResponse(array('charset' => Configure::read('App.encoding'))));

将底部改为

define('CRON_DISPATCHER',true);
$Dispatcher = new Dispatcher();
$Dispatcher->dispatch(new CakeRequest($argv[1]), new CakeResponse(array('charset' => Configure::read('App.encoding'))));

您在这里做了两件事:将 CRON_DISPATCHER 设置为 true,并传递环境变量 ($argv[1])。

在您的控制器中,在执行其他任何操作之前添加此行:

if (!defined('CRON_DISPATCHER')) { $this->redirect('/'); exit(); }

这将确保访问 yoursite.com/controller/cronaction 的人无法运行您的脚本。

在 webroot 的 htaccess 文件中,添加:

<Files  "cron_dispatcher.php">
    Order deny,allow
    Deny from all
</Files>

这将确保访问 yoursite.com/cron_dispatcher.php 的人无法运行它。

现在使用以下命令设置 cron 作业:

php /home/yoursite/public_html/cakephp/app/webroot/cron_dispatcher.php /controller/cronjobaction

【讨论】:

  • 感谢您,我已按照上面的说明进行操作,当 cron 运行时出现此错误:状态:302 Found X-Powered-By: PHP/5.3.8 Set-Cookie: CAKEPHP= 0b8743f09a88ad2fbcf3a821355d46c7;过期=星期一,2012 年 11 月 5 日 00:25:02 GMT;路径=/; HttpOnly 位置:https:///tasks/cron_emailer 内容类型:text/html;字符集=UTF-8。知道我哪里可能出错了吗?谢谢你
【解决方案2】:

$argc$argv 是在 CLI 中设置的环境变量。
您可能需要检查register_argc_argv 上的 PHP 设置(不应禁用)

【讨论】:

  • 根据docs.php.net/manual/en/features.commandline.differences.php register_argc_argv 在 CLI 中默认启用,您无法通过 php.ini 禁用它。
  • @dhofstet 我想你误解了。这是默认启用的。并且可以在 php.ini 中禁用。
  • 啊,很有趣。任何想法为什么它说它未定义?你认为我应该把它放在 app/ 目录而不是 webroot 中吗?我觉得这不会产生影响,因为 $argc 应该在系统上的所有文件中都可用,不是吗?
  • 如果配置已禁用,则变为未定义。 或者你是在 Object 类中调用 $argc 吗?
【解决方案3】:

不需要 Cron Dispatcher

现在需要创建 cron 调度程序,而且从未需要。 use a CakePHP application via cron 唯一需要的就是create a console command,然后调用它:

*/5  *    *    *    *  cd /full/path/to/app && Console/cake myshell myparam

在过去的某个时候,书中有some poor advice,其中有since been corrected

【讨论】:

    【解决方案4】:

    我不确定你是如何设置你的 cron 作业的,但是像这样的东西怎么样:

    */10 * * * * wget -O - -q "http://localhost/url/to/your/controller/action"
    

    当然,更好的主意可能是创建一个蛋糕壳并运行它,这取决于您的需要。

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2016-11-23
      相关资源
      最近更新 更多