Cron Dispatcher CakePHP 2.0


Cron Dispatcher CakePHP 2.0

我正在使用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的设置。

如果有人感兴趣,

在新的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的人无法运行您的脚本。

在web浏览器的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

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

不需要Cron Dispatcher

从来都不需要创建cron调度程序。通过cron使用CakePHP应用程序所需的唯一事情是创建一个控制台命令,并将其命名为:

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

在过去的某个时候,书中有一些不好的建议,这些建议已经被纠正了。

我不知道你是如何设置你的cron作业的,但是像这样如何:

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

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