我正在使用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文件本身中没有定义。我在谷歌上搜索没有结果。我不能百分之百确定调度员是如何工作的,但如果有任何帮助,我将不胜感激。谢谢。
=更新
godaddy的共享主机不允许您更改argc argv的设置。

最佳答案

如果有人感兴趣,
在新的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>

这将确保pople访问yoursite.com/cron_dispatcher.php时无法运行它。
现在使用如下命令设置cron作业:
php /home/yoursite/public_html/cakephp/app/webroot/cron_dispatcher.php /controller/cronjobaction

08-27 13:11