CakePHP 2.X Cron作业不工作 在底部部分编辑2017年的内容

CakePHP 2.X Cron作业不工作 在底部部分编辑2017年的内容,cakephp,cron,cakephp-2.5,Cakephp,Cron,Cakephp 2.5,我已经阅读了以下文档条目: 以及这个问题: 我在尝试实现两个cron作业函数时遇到问题,其中一个函数与上面列出的发送测试电子邮件的堆栈溢出问题完全相同。另一种方法是简单地在我的“crons”表中插入一个新行。两者都不起作用,我相信这就是我试图称cron为jobs的方式。我不相信我使用了正确的路径 Console/Command/CronShell.php class CronShell extends AppShell { public $uses = array('Cron');

我已经阅读了以下文档条目:

以及这个问题:

我在尝试实现两个cron作业函数时遇到问题,其中一个函数与上面列出的发送测试电子邮件的堆栈溢出问题完全相同。另一种方法是简单地在我的“crons”表中插入一个新行。两者都不起作用,我相信这就是我试图称cron为jobs的方式。我不相信我使用了正确的路径

Console/Command/CronShell.php

class CronShell extends AppShell {
    public $uses = array('Cron');

    public function trigger() {
        $cron = array(
            'Cron' => array(
                'title' => 'Cron Test'
            )
        );

        $this->Cron->create();
        $this->Cron->save($cron);
    }
}
App::uses('CakeEmail', 'Network/Email');

class EmailShell extends Shell {

    public function main() {

       $Email = new CakeEmail();
       $Email->template('test', 'default')
           ->emailFormat('html')
           ->to(email@domain.com)
           ->from('no-reply@domain.com')
           ->subject('Cron Email')
           ->send();
    } // END MAIN FUNCTION

}
作为索引操作的一部分,我使用上述代码设置了一个CronsController.php。当通过控制器访问时,代码工作正常,因此问题在于shell或cron作业

我习惯于使用以下命令将此方法作为cron作业调用,但没有一个有效…

***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake cronshell trigger
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake Cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake CronShell trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake cronshell trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake Cron trigger
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake CronShell trigger
类似地,我尝试使用下面的shell发送测试电子邮件

Console/Command/EmailShell.php

class CronShell extends AppShell {
    public $uses = array('Cron');

    public function trigger() {
        $cron = array(
            'Cron' => array(
                'title' => 'Cron Test'
            )
        );

        $this->Cron->create();
        $this->Cron->save($cron);
    }
}
App::uses('CakeEmail', 'Network/Email');

class EmailShell extends Shell {

    public function main() {

       $Email = new CakeEmail();
       $Email->template('test', 'default')
           ->emailFormat('html')
           ->to(email@domain.com)
           ->from('no-reply@domain.com')
           ->subject('Cron Email')
           ->send();
    } // END MAIN FUNCTION

}
我再次尝试了以下命令。对于这些命令中的每一个,我还尝试按照文档的说明删除方法名“main”

***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake email main
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake emailshell main
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake Email main
***** cd /home1/bhndbrwn/public_html/cake2/app && Console/cake EmailShell main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake email main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake emailshell main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake Email main
***** cd /home1/bhndbrwn/public_html/cake2/app/Console/cake EmailShell main
2017年编辑-仍不工作

我已将我的cron更新为
/home/allfan5/public\u html/allfans/app/Console/cake.php-app/home/allfan5/public\u html/allfans/app/test action

我有一个名为TestShell的shell和一个名为“action”的函数。action函数是完全空的,用于测试(我也尝试了一个函数,在这个函数中我给用户发电子邮件,但我遇到了错误,所以我创建了一个新的shell和一个完全空的函数,我得到了相同的错误)

我现在收到的错误是

2017-10-14 21:34:02 Error: Fatal Error (64): Cannot use ‘String’ as class name as it is reserved in [/home/allfan5/public_html/allfans/lib/Cake/Utility/String.php, line 25]
2017-10-14 21:34:02 Error: [FatalErrorException] Cannot use ‘String’ as class name as it is reserved
Stack Trace:
#0 /home/allfan5/public_html/allfans/lib/Cake/Error/ErrorHandler.php(203): ErrorHandler::handleFatalError(64, ‘Cannot use ‘Str…’, ‘/home/allfan5/p…’, 25)
#1 /home/allfan5/public_html/allfans/lib/Cake/Core/App.php(929): ErrorHandler::handleError(64, ‘Cannot use ‘Str…’, ‘/home/allfan5/p…’, 25, Array)
#2 /home/allfan5/public_html/allfans/lib/Cake/Core/App.php(902): App::_checkFatalError()
#3 [internal function]: App::shutdown()
#4 {main}
我不知道这是什么原因,因为shell函数是完全空的。甚至当我尝试发送电子邮件给用户时,我也复制了代码并从控制器上运行,效果很好。因此,Cake执行或调用shell的方式有问题


我在PHP5.4上运行cake 2.5,我们使用不同的方式运行cron:

在webroot目录中,我有一个名为corn_dispatcher.php的文件,它是index.php文件的副本,但对文件末尾进行了一些修改:

App::使用('Dispatcher','Routing')
定义('CRON_DISPATCHER',true)
$Dispatcher=newdispatcher()
$Dispatcher->dispatch(新的CakeRequest($argv[1]),新的CakeResponse())

然后我有一个CronjobController.php文件,其中包含与单个cron相关的函数。 还添加了带有$this->Auth->allow()的beforeFilter函数;(因此cron运行时不会因ACL限制而中断)以及删除布局和自动登录

接下来设置到cron的路由

最后,在我的crontab文件中,我将:

1 6***php-f/webroot/cron_dispatcher.php/routedUrl的路径

还有几件事需要注意:

  • 您可能需要以完整路径运行php表单,而不是像上面所说的那样
  • 如果正在创建文件,您可能需要在您的linux发行版上以www数据用户或同等身份运行Theh crontab
  • 另外,如果AppController.php的beforeFilter函数中有很多内容,那么可能需要设置一个条件来查看HTTP_HOST值是否为空,以便尽可能轻松地运行cron

我希望这会有所帮助。

使用cake shell脚本的完整路径(而不是使用
cd
),然后按照控制台说明传递应用程序目录的完整路径:

您的工作路径应与您的应用程序路径相同 使用“-app”参数更改路径。示例:-应用程序 相对/path/to/myapp或-app/absolute/path/to/myapp

因此,您的cron选项卡变成:

 * * * * * /home1/bhndbrwn/public_html/cake2/app/Console/cake -app /home1/bhndbrwn/public_html/cake2/app/ cron trigger
此方法是“普通”方法,不需要编辑或添加任何php文件来分派Cron作业,它使用CakePHP 2.x解决了这个问题

因此,对于CakePHP 2.x,请使用以下内容:

设置:

  • 您有一个名为CustomShell.php的Shell,位于
    /public\u html/app/Console/Command/CustomShell.php

  • 在这个CustomShell.php中有几个函数:
    functionThis()
    functionThis()

如何调用此Shell以及如何调用每个函数?

进入Cron作业管理器中的cPanel(或您正在使用的任何管理器),您将在命令中键入以下内容:

  • 语法如下所示:

    cd/home/your\u user/public\u html/app&&Console/cake shell\u name函数\u name

  • 以下是我的示例中cmd的外观:

    cd/home/your_user/public_html/app&&Console/cake自定义功能此

请注意,函数名不是
CustomShell
,而是
custom
。另外,请注意我如何调用
函数this()
,您可以将其留空,它将自动调用
CustomShell.php
文件中的
main()
函数

我正在PHP5.4上运行cake 2.5

您可能正在运行PHP5.4,但PHPCLI的版本可能不同,例如PHP7。请检查您的cli版本。在PHP7中,不能使用名称字符串创建类

* @package       Cake.Utility
*/
class String {

你读过了吗?第一次我对这条路感到困惑。第二个完全不起作用。另外,这是针对旧版本的Cake,因此不确定路径是否正确。我试图调整到Cake 2.X供应商路径,但仍然不起作用。我想避免使用供应商目录,因为根据文档,shell应该放在Console/Command中。@slywalker该文档很糟糕:|。不要误导用户认为运行cron作业需要“特殊的东西”。bowlerae如果您可以在cli上运行命令,但它不能通过cron工作,则需要指出如何/为什么作为,但环境变量除外,这与流行的看法相反