我已阅读以下文档条目:
http://book.cakephp.org/2.0/en/console-and-shells.html
http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html
以及这个问题:
Creating Cron Jobs in CakePHP 2.x
我在尝试实现两个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
答案 0 :(得分:2)
我们使用不同的方式运行crons:
在webroot目录中我有一个名为corn_dispatcher.php的文件,它是index.php文件的副本,但对文件末尾进行了一些修改:
App ::使用(' Dispatcher',' Routing');
定义(' CRON_DISPATCHER',TRUE);
$ Dispatcher = new Dispatcher();
$ Dispatcher-> dispatch(新的CakeRequest($ argv [1]),新的CakeResponse());
然后我有一个CronjobController.php文件,其中包含与各个crons相关的函数。 还使用$ this-> Auth-> allow()添加了beforeFilter函数; (因此,由于ACL限制,crons运行时不会中断)以及删除布局和自动渲染
接下来设置通往crons的路线。
最后在我的crontabs文件中,我把:
1 6 * * * php -f /path-to-webroot/cron_dispatcher.php / routedUrl
还有几点需要注意:
我希望有所帮助。
答案 1 :(得分:2)
这种方法是"香草"方法,不要求你编辑或添加任何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
请注意,函数名称不是CustomShell
,而是custom
。另外,请注意我如何调用functionThis()
,您可以将其留空,它会自动调用main()
文件中的CustomShell.php
函数。
答案 2 :(得分:2)
我在PHP 5.4上运行cake 2.5
你可能正在运行php 5.4,但你的php-cli可能在不同的版本,例如可能是php 7检查你的cli版本。在php 7中,您无法创建名为String的类。
* @package Cake.Utility
*/
class String {
答案 3 :(得分: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