使用Zend Framework创建cronjob

时间:2020-03-06 14:49:18  来源:igfitidea点击:

我试图编写一个cronjob控制器,所以我可以调用一个网站,并执行所有模块cronjob.php。现在我的问题是我该怎么做?

可以选择curl,这样我也可以计算错误和成功吗?

[更新]

我想我还没有解释清楚。

我想做的是有一个文件,我可以从http:// server / cronjob调用该文件,然后使它执行每个/application/modules/*/controller/CronjobController.php,或者采用另一种方法来执行cronjobs不在模块所在的位置,而是在同一位置。这将为我提供一个优势,即如果某个模块不存在,则它不会尝试运行其cronjob。

现在我的问题是,我们将如何执行CronjobController的所有模块,还是采用完全不同的方式来使其仍保持模块化?

而且我希望能够给出成功完成了多少cronjobs,以及没有成功完成cronjobs的情况。

解决方案

我会提醒我们,将cronjobs公开提供给公众,因为它们可能会在正常时间之外触发,并且取决于它们的工作方式,会导致问题(我知道这不是我们想要的,但是通过将它们放入实际的控制器中,它就可以实现从浏览器中)。例如,我有一个cron发送电子邮件。如果有人找到了cron URL并开始点击它,我就会不断地发垃圾邮件。

我所做的是创建一个cron文件夹,并在其中创建了heartbeat.php,该文件为我引导了Zend Framework(减去MVC)。它检查包含所有已安装cron作业的列表的数据库,如果需要运行它们,则生成该cron作业的类的实例并运行它。

cron作业只是抽象cron类的子类,该类具有诸如install(),run(),deactivate()等方法。

为了解雇我,我只有一个简单的crontab条目,该条目每5分钟运行一次,命中heartbeat.php。到目前为止,它在两个不同的站点上都表现出色。

几天前有人在fw-general(我建议我们在使用Zend Framework时阅读的邮件列表)中提到此博客条目。

还有针对Zend_Controller_Request_Cli的建议,该建议迟早会解决。

http://framework.zend.com/wiki/display/ZFPROP/Zend_Scheduler+-+Matthew+Ratzloff?rootCommentId=1819我通过Google搜索发现的这个链接似乎也很有趣。

我一直在寻找自己想要的东西,但是如果我似乎找不到自己想要的东西,我将不得不自己找我。

我们是否可以访问模块目录的文件系统?我们可以遍历目录并确定CronjobController.php在何处可用。然后,我们可以使用Zend_Http_Client通过HTTP访问控制器,也可以使用Zend_Test_PHPUnit这样的方法:在本地模拟实际的调度过程。

我们可以设置一个数据库表来保存对cronjob脚本的引用(在模块中),然后在通过/失败时使用带有返回值的exec命令。

为什么不只创建一个crontab.php,包括它,或者需要它一个index.php引导文件?

考虑到引导程序正在执行Zend_Loader :: registerAutoload(),我们可以直接开始使用模块,例如,myModules_MyClass :: doSomething();

这样,我们将跳过控制器。 Controller的工作是通过http控制访问。在这种情况下,我们不需要控制器方法,因为我们在本地访问。

经过一些研究和大量拖延,我得出一个简单的结论,即ZF格式的cron脚本应包含zend framework应用程序的所有功能,而又不包含所有视图内容。我是通过在应用程序目录中创建一个新的cronjobfoo.php文件来实现的。然后,我从以下内容中获取了最低限度的费用:
-我的前端控制器(index.php)
-我的bootstrap.php

我取出了所有视图内容,并专注于保持环境设置,数据库设置,自动加载器和注册表设置。我必须花一些时间来纠正文档根变量,并删除一些从引导程序复制的OO功能。

在那之后,我只是编码了..就我而言,它是在编译并通过电子邮件发送夜间报告。使用Zend_Mail很棒。当我确信自己的脚本可以按照我想要的方式工作时,我将其添加到了crontab中。

祝你好运!

对于Zend Framework,我目前正在使用下面概述的代码。该脚本仅包含门户文件index.php,在该文件中将引导所有路径,环境和其他Zendy代码。通过在cron脚本中定义一个常量,我们取消了运行应用程序的最后一步。

这意味着该应用程序仅是安装程序,甚至没有引导程序。在这一点上,我们开始引导我们需要的资源,那就是

//public/index.php

if(!defined('DONT_RUN_APP') || DONT_RUN_APP == false) {  
    $application->bootstrap()->run();
}

// application/../cron/cronjob.php

define("DONT_RUN_APP",true);
require(realpath('/srv/www/project/public/index.php'));
$application->bootstrap('config');
$application->bootstrap('db');

//cron code follows

看一下zf-cli

  • padraic / ZFPlanet掌握大师的脚本-GitHub

这样可以很好地处理所有cron作业。