首页 文章

CakePHP 2.X Cron工作不起作用

提问于
浏览
8

2017年底部编辑

I've read the following doc entries:

http://book.cakephp.org/2.0/en/console-and-shells.html

http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html

As well as this question:

Creating Cron Jobs in CakePHP 2.x

我在尝试实现两个cron作业函数时遇到了麻烦,其中一个与上面列出的Stack Overflow问题完全相同,用于发送测试电子邮件 . 另一个只是在我的“crons”表中插入一个新行 . 两者都不起作用,我相信这是我试图称之为cron工作的方式 . 我不相信我正在使用正确的道路 .

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

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

I used to following commands to call this method as a cron job, none worked...

***** 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

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

}

Again I tried the following commands. 对于这些命令中的每一个,我还尝试按照文档的说明删除方法名称"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 EDIT - STILL NOT WORKING

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

我有一个名为TestShell的shell和一个名为“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的方式有问题 .

我在PHP 5.4上运行cake 2.5

4 回答

  • 2

    我们使用不同的运行方式:

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

    App :: uses('Dispatcher','Routing');
    define('CRON_DISPATCHER',true);
    $ Dispatcher = new Dispatcher();
    $ Dispatcher-> dispatch(new CakeRequest($ argv [1]),new CakeResponse());

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

    接下来设置通往crons的路线 .

    最后在我的crontabs文件中,我把:

    1 6 * * * php -f /path-to-webroot/cron_dispatcher.php / routedUrl

    还有一点需要注意:

    • 你可能需要运行php表单的完整路径,而不是像上面的那样 .

    • 如果正在创建文件,您可能需要在Linux发行版上运行teh crontab作为www-data用户或等效文件

    • 此外,如果你在AppController.php的beforeFilter函数中有很多东西,你可能需要设置一个条件来查看HTTP_HOST值是否为空,这样你就可以保持crons的运行尽可能轻

    我希望有所帮助 .

  • 2

    这种方法是“vanilla”方法,不需要你编辑或添加任何php文件来调度你的Cron作业,它可以用CakePHP 2.x开箱即用 .

    所以对于CakePHP 2.x使用这个:

    Settings:

    • 你有一个名为CustomShell.php的Shell位于 /public_html/app/Console/Command/CustomShell.php

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

    How to call this Shell and how to call each function as I please?

    您可以在Cron作业管理器中找到您的cPanel(或您正在使用的任何管理员),这是您在命令中输入的内容:

    • 语法如下所示:

    cd /home/your_user/public_html/app && Console/cake shell_name function_name

    • 这就是我的示例中cmd的样子:

    cd /home/your_user/public_html/app && Console/cake custom functionThis

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

  • 1

    我在PHP 5.4上运行cake 2.5

    你可能运行PHP 5.4但你的php-cli可能在不同的版本,例如可能是PHP 7检查你的cli版本 . 在php 7中,您无法创建名为String的类 .

    * @package       Cake.Utility
    */
    class String {
    
  • 2

    使用cake shell脚本的完整路径(而不是使用 cd ),然后根据控制台说明传递app目录的完整路径:

    您的工作路径应与您的应用程序路径相同,以使用'-app'参数更改路径 . 示例:-app relative / 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
    

相关问题