我试图写一个cronjob控制器,所以我可以调用一个网站,并有所有模块cronjob.php执行。 现在我的问题是,我该怎么做呢?
将卷曲是一种选择,所以我也可以算错误和成功?
[更新]
我想我已经没有足够的解释它。
我想要做的是有一个文件,我可以打电话给像HTTP://服务器/的cronjob ,然后让它执行每/application/modules/*/controller/CronjobController.php或有做这样所有的另一种方式cronjobs是不是在一个地方,但在同一个地方的模块的位置。 这给我的优点,即如果一个模块不存在,不尝试运行它的cronjob。
现在我的问题是如何将你执行所有模块CronjobController或者你会做一个完全地不同的方式,因此仍然停留模块化?
我希望能够giveout多少cronjobs成功运行,并且有多少没
Answer 1:
一些研究和大量的拖延后,我来简单的结论,你的Zend Framework应用程序一个ZF-美化版的cron脚本应该包含所有的功能 - 无所有的观点的东西。 我创建我的应用程序目录中的新cronjobfoo.php文件来实现这一点。 然后,我把最低限度从:-My前端控制器(的index.php)-My bootstrap.php中
我拿出所有的视图的东西,专注于保持环境的设置,DB设置,自动加载机,和注册表设置。 我不得不采取一点时间来更正文档根目录变量,并删除了一些从我的引导复制OO功能。
从那以后,我只是编码路程。在我的情况下,它被编译并通过电子邮件发送出去夜间报告。 这是伟大的使用Zend_Mail中去。 当我有信心,我的剧本是工作,我想要的方式,我只是说是我的crontab。
祝好运!
Answer 2:
对于Zend框架我目前使用的波纹管中列出的代码。 该脚本只包含门户index.php文件,所有的路径,环境等Zendy代码自举。 通过在cron的脚本定义常量,我们取消了最后一步,在运行应用程序。
这意味着应用程序仅设置,甚至没有自举。 在这一点上,我们开始的Bootstrap我们需要的资源,那就是
//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
Answer 3:
我要提醒把你cronjobs向公众开放的,因为他们可以正常的时间之外触发,并根据他们所做的事情,引起的问题(我知道这是不是你想要什么,而是将它们放入一个实际控制人就变成可达从浏览器)。 例如,我有一个cron的发送电子邮件。 如果有人发现cron的URL和刚开始打它我会不断的垃圾邮件。
我所做的就是让一个cron文件夹,并在那里创建了自举Zend框架(减去MVC)对我来说是heartbeat.php。 它检查其已安装的所有cron作业列表的数据库,如果现在是时候让他们跑,产生cron作业类的一个实例,并运行它。
在cron作业是从具有类似安装(),运行(方法的抽象类的cron),停用()等刚子类
要火了我的工作,我只是有一个运行每5分钟击中heartbeat.php一个简单的crontab项。 到目前为止,它的工作奇妙的在两个不同的地点。
Answer 4:
有人提到这篇博客前几天在FW-一般(一个邮件列表 ,我建议你阅读时,你使用Zend框架)。
还有一个建议Zend_Controller_Request_Cli ,这应该解决这个问题迟早的事。
Answer 5:
我有机会获得一个专用的服务器和我最初曾经为cron作业不同的引导。 我终于恨的想法,只是希望我可以在现有的MVC设置中做到这一点,而不必理会走动的事情。
我创建了一个文件cron.sh,保存的是我的网站根目录(不公开)中,并在其中我把一个系列,我想运行的命令。 因为我想在我一次我的控制器照常内写的PHP运行很多命令,并添加卷曲呼叫cron.sh.内这些网址 例如curl http://www.mysite.com/cron_controller/action
然后cron的界面上,我跑bash /path/to/cron.sh
。
正如有人指出你的crons可以由任何人谁猜中URL所以有总是告诫被解雇。 你可以找到许多不同的方式解决这一点。
Answer 6:
看看zf-cli
:
- GitHub上-在主从帕德里克/ ZFPlanet脚本
这种处理好所有的cron作业。
Answer 7:
为什么不创建一个crontab.php,包括,或要求的index.php引导文件?
考虑到自举正在执行Zend_Loader::registerAutoload()
你就可以开始直接与模块的工作,例如, myModules_MyClass::doSomething();
这样,你跳过控制器。 该控制器的工作是控制通过HTTP访问。 在这种情况下,因为你是在本地访问你不需要控制器的方法。
Answer 8:
http://framework.zend.com/wiki/display/ZFPROP/Zend_Scheduler+-+Matthew+Ratzloff?rootCommentId=1819这个环节我发现googleing似乎藏汉会相当interessting。
它不是什么安静,我在寻找,但如果我似乎无法找到我一直在寻找,我将不得不自己。
Answer 9:
你有没有在模块的目录文件系统访问? 你可以遍历目录,并确定一个CronjobController.php可用。 然后,你既可以使用Zend_Http_Client
通过HTTP访问控制器或使用像的方法Zend_Test_PHPUnit
:本地模拟实际调度过程。
Answer 10:
你可以建立一个数据库表来保存到的cronjob脚本引用(在你的模块),然后使用exec命令与通返回值/失败。
Answer 11:
我伸出格雷戈尔答案与这个职位 。 这是哪冒出来的:
//public/index.php
// Run application, only if not started from command line (cli)
if (php_sapi_name() != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) {
$application->run();
}
谢谢格雷戈尔!
Answer 12:
我的解决方案:
- 卷曲/ cron的
- 全球的cron方法include_once所有控制器
- 检查是否每个controllors的有 - > cron的方法
- 如果他们有,运行这些。
公共cron的网址(卷曲)是没有问题的,有很多种方法,以避免滥用。 至于说,检查远程IP是最简单的。
Answer 13:
这是我的方式来与Zend框架运行cron任务
在引导我将保持环境设置,因为它是负MVC:
public static function setupEnvironment()
{
...
self::setupFrontController();
self::setupDatabase();
self::setupRoutes();
...
if (PHP_SAPI !== 'cli') {
self::setupView();
self::setupDbCaches();
}
...
}
此外,在引导,我会修改setupRoutes并添加自定义路线:
public function setupRoutes()
{
...
if (PHP_SAPI == 'cli') {
self::$frontController->setRouter(new App_Router_Cli());
self::$frontController->setRequest(new Zend_Controller_Request_Http());
}
}
App_Router_Cli是一个新的路由器的类型,其确定所述控制器,动作,并且基于该类型的请求的可选参数: script.php controller=mail action=send
。 我在这里发现了这个新的路由器: 建立克朗与Zend框架1.11 :
class App_Router_Cli extends Zend_Controller_Router_Abstract
{
public function route (Zend_Controller_Request_Abstract $dispatcher)
{
$getopt = new Zend_Console_Getopt (array());
$arguments = $getopt->getRemainingArgs();
$controller = "";
$action = "";
$params = array();
if ($arguments) {
foreach($arguments as $index => $command) {
$details = explode("=", $command);
if($details[0] == "controller") {
$controller = $details[1];
} else if($details[0] == "action") {
$action = $details[1];
} else {
$params[$details[0]] = $details[1];
}
}
if($action == "" || $controller == "") {
die("Missing Controller and Action Arguments == You should have:
php script.php controller=[controllername] action=[action]");
}
$dispatcher->setControllerName($controller);
$dispatcher->setActionName($action);
$dispatcher->setParams($params);
return $dispatcher;
}
echo "Invalid command.\n", exit;
echo "No command given.\n", exit;
}
public function assemble ($userParams, $name = null, $reset = false, $encode = true)
{
throw new Exception("Assemble isnt implemented ", print_r($userParams, true));
}
}
在CronController我做一个简单的检查:
public function sendEmailCliAction()
{
if (PHP_SAPI != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) {
echo "Program cannot be run manually\n";
exit(1);
}
// Each email sent has its status set to 0;
crontab的运行这样的命令:
* * * * * php /var/www/projectname/public/index.php controller=name action=send-email-cli >> /var/www/projectname/application/data/logs/cron.log
Answer 14:
它没有意义的,运行在同一个目录或cron作业文件夹中的引导。 我创建实现cron作业工作,更好的和简单的方法。 请按照下面的东西,使你的工作变得容易和智能:
创建一个cron作业文件夹,例如任何你想要的“的cron”或“crobjob”等。
有时候,我们需要的cron作业与像1个小时间隔或1天的间隔不同区间的服务器上运行,我们可以设置在服务器上。
创建cron作业文件夹中的文件,就像我创建了一个“的init.php”,现在让我们假设你想简讯发送给用户,每天一次。 你不需要做了Zend代码的init.php。
所以刚成立的init.php卷曲功能,并添加您的控制器动作的URL在卷曲功能。 因为我们的主要目的是,一个动作应该在每天被调用。 例如,URL应该是这样的:
https://www.example.com/cron/newsletters
因此,建立在卷曲功能此URL,并调用的init.php此功能在同一个文件。
在上面的链接,你可以看到“的cron”是控制器和通讯的行动在这里你可以做你的工作,以同样的方式,并不需要运行的引导文件等。
文章来源: Create cronjob with Zend Framework