8

底部部分的 2017 年编辑

我已阅读以下文档条目:

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

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

以及这个问题:

在 CakePHP 2.x 中创建 Cron 作业

我在尝试实现两个 cron 作业功能时遇到问题,其中一个与上面列出的 Stack Overflow 问题完全相同,用于发送测试电子邮件。另一个简单地在我的“crons”表中插入一个新行。两者都不起作用,我相信这是我试图调用 cron 作业的方式。我不相信我正在使用正确的路径。

控制台/命令/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 作业上。

我曾经按照命令将此方法称为 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 发送测试电子邮件

控制台/命令/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

}

我再次尝试了以下命令。对于这些命令中的每一个,我还尝试按照文档的说明删除方法名称“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_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

4 回答 4

2

此方法是“vanilla”方法,不需要您编辑或添加任何 php 文件来调度您的 Cron 作业,它适用于 CakePHP 2.x

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

设置:

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

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

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

您在 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

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

于 2015-03-02T15:51:02.293 回答
2

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

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

App::uses('Dispatcher', '路由');
定义('CRON_DISPATCHER'​​,真);
$Dispatcher = 新的 Dispatcher();
$Dispatcher->dispatch(new CakeRequest($argv[1]), new CakeResponse());

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

接下来设置到 crons 的路由。

最后在我的 crontabs 文件中,我输入:

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

还有几点需要注意:

  • 您可能需要以完整路径运行 php,而不是像我上面那样。
  • 如果正在创建文件,您可能需要在您的 Linux 发行版上以 www-data 用户或等效用户身份运行 crontab
  • 此外,如果您在 AppController.php 的 beforeFilter 函数中有很多东西,您可能需要设置一个条件来查看 HTTP_HOST 值是否为空,这样您就可以尽可能轻松地运行 crons

我希望这会有所帮助。

于 2014-04-28T14:00:41.083 回答
2

我在 PHP 5.4 上运行 cake 2.5

您可能正在运行 php 5.4,但您的 php-cli 可能在不同的版本中,例如可能是 php 7 检查您的 cli 版本。在 php 7 中,您不能创建名称为 String 的类。

* @package       Cake.Utility
*/
class String {
于 2017-10-21T13:30:29.740 回答
1

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

您的工作路径应该与您的应用程序路径相同,以使用“-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
于 2014-04-28T14:52:21.547 回答