gpt4 book ai didi

php - Cakephp cron 作业调用 Controller 的 Action

转载 作者:可可西里 更新时间:2023-11-01 13:26:49 26 4
gpt4 key购买 nike

我几个月前开始使用CakePHP (1.2) 为公司的应用程序添加一些小功能,我对它不太熟悉。

在合并到生产服务器之前,我们先在开发服务器上进行本地测试。

我希望每小时调用一次 Controller 操作,通过我的研究,我认为这是执行此操作的最佳方式,一个 cron 作业。


尝试 1

看完这些,

http://bakery.cakephp.org/articles/mathew_attlee/2006/12/05/calling-controller-actions-from-cron-and-the-command-line

http://book.cakephp.org/1.2/en/view/110/Creating-Shells-Tasks

我可以毫无错误地执行某些操作,但操作未执行。

基于这些示例,我在我的应用程序目录(不是 app/webroot)中添加了一个名为 cron_dispatcher.php 的文件,然后从应用程序目录执行此命令

php cron_dispatcher.php /controller/action/param

仍然没有任何反应,但当我通过 url 调用它时,它工作得很好。


尝试 2

我尝试创建一个 shell (email.php) 来调用/app/vendors/shells/中的操作。

<?php

class EmailShell extends Shell {

public function main() {
$this->out('Test');
}

}
?>

这成功地在控制台输出测试

cake email main

但后来我找不到如何调用 Controller 的操作。我试过了

$this->requestAction('/controller/action');

我还尝试从与 shell 中的 main 不同的函数进行调用。

我曾尝试像使用模型一样将 Controller 包含在 $uses 变量中,但这没有用(我认为这没有意义)

我不认为创建任务是解决方案,因为我不想复制 sendEmails 函数,因此我正在寻找一种方法来从 shell 或其他任何地方调用 Controller 的操作!

我可能缺少一些理论,谢谢


解决方案

我将一些方法从 Controller 移到了模型中,并且能够从 shell 中调用它们。

App::import('Component', 'Email');

class SendMemosShell extends Shell {

var $uses = array(
'Memo',
);

public function main() {

}

public function sendEmails () {
$this->Email =& new EmailComponent(null);
$memoList = $this->Memo->getMemos();
//...
}
}

此链接有帮助 http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html


编辑:澄清了一些信息并添加了解决方案

最佳答案

其实这是一个很常见的问题,也遇到过。

Controller 正在决定如何处理请求并启动该任务。在这种情况下,不需要 Controller ,因为您有一个 shell 任务,任务已经很清楚了。

知道这一点,调用 Controller 方法就没有意义了。

所以重新考虑您的选择,是的,这是一个相当困难的选择。例如,您可能决定发送电子邮件是一个业务逻辑步骤,因此它应该在模型中。另一种选择是将其完全分离(这是我们最喜欢的)。

在这种情况下,您必须创建一个队列,将所有要发送的电子邮件放入其中。这是一个很好的设计,因为你知道 Controller 中的逻辑数量下降并且它们是分开的。这样您就可以获得电子邮件服务。

例如,您可以要求服务发送一封“新用户”邮件。然后将 User 对象添加到它,它应该会自行处理。这样你甚至可以扩展,因为你的服务可以外包,你可以在服务上扩展多个服务器等。

编辑:

好问题。

采取的步骤:

  1. 首先集中“发送电子邮件”流程。因此,选择一个位置放置它。您可以决定:将电子邮件添加到队列或直接调用该服务。例如,您可以添加用于发送电子邮件的 shell 任务。

  2. 调用 shell:现在你遇到了调用 shell 的问题。一般来说,你不想。为什么不?因为一个 shell(一个任务)可以运行很长时间。所以这就是我们在两者之间使用队列的原因。因此,您可以询问队列或让队列向您发送某事已完成的消息。例如,考虑一个已关闭的邮件服务器。您必须重试等。这不应该出现在 Web 请求中,因为用户正在等待响应。

  3. 第三步是从您的 cron 调用 shell,现在这很容易,因为您已经在命令行上,因此您可以使用标准调用。

无论如何,有一些选项可以直接从 Controller 调用,但你不应该这样做。这篇文章提供了一些非常有趣的见解: CakePHP: Run shell job from controller

编辑 31/08/'13:一些示例也参见 CakePHP 的事件系统:http://book.cakephp.org/2.0/en/core-libraries/events.html

关于php - Cakephp cron 作业调用 Controller 的 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com