嗨我想通过cronjob执行一个函数来启动一个csv导入。目前进口被通过的cronjob在浏览器中访问控制器tld.de/Update通过Cronjob执行Silverstripe函数
控制器已验证码http://pastie.org/8351266
我怎么能执行功能的init()触发?
Thx!
嗨我想通过cronjob执行一个函数来启动一个csv导入。目前进口被通过的cronjob在浏览器中访问控制器tld.de/Update通过Cronjob执行Silverstripe函数
控制器已验证码http://pastie.org/8351266
我怎么能执行功能的init()触发?
Thx!
在SilverStripe中,您可以访问任何可通过HTTP访问的路由,也可以通过在命令行中运行cli-script.php
(需要安装,但缘故)所以,从你的项目目录
还有就是sake
这仅仅是围绕CLI-script.php的一个bash封装,可以在运行将执行相同的操作两个命令(这种情况下,运行开发/编译):
php framework/cli-script.php dev/build
sake dev/build
看到文档的silverstripe的命令行ussage:http://doc.silverstripe.org/framework/en/topics/commandline
你问题的第二部分(如何调用从交流的方法(cronjob)
我假设你的控制器是一个Page_Controller或它的一个子类(如此绑定到SiteTree模型),然后为您完成路由(它需要您在CMS中设置的URL)。 所以让我们看看一些示例代码,并让我们假设你有一个网页的URLSegment about
:
class Page_Controller extends ContentController {
private static $allowed_actions = array('something');
public function init() {
// the init method will run before every action
// this means this code will run, no matter if you visit /about or /about/something
}
public function index() {
// this is the default action (this code is optional and can be removed),
// and will be called if you visit website.com/about
return $this;
}
public function something() {
// this is the somethingaction,
// and will be called if you visit website.com/about/something
// do something here
return $this;
}
}
然后就可以调用运行,以获得index()
的结果:
php framework/cli-script.php about
,这让的something()
结果:
php framework/cli-script.php about/something
注意:初始化会见hod本身不能通过URL访问,它是在动作之前运行的“设置”
注意:除index()
之外的所有操作都必须通过将它们添加到$allowed_actions
(还请注意,您需要?flush = 1加入$allowed_actions
重新加载配置缓存)
编辑后:这实际上是你的第一个问题的答案,看到你的代码示例后,这除了:
它以同样的方式独立控制器,只是你必须定义路线,并确保你有$Action
在r oute以便something()
可以调用
的完整解决方案
我不熟悉Silverstripe见Zauberfisch's answer,但如果我理解正确的话,该控制器init
功能可以通过HTTP请求来调用。
由于silverstripe文档说,你可以调用命令行的任何网址:
php framework/cli-script.php Update/init
更多信息,请here,并考虑使用sake
这项任务。
这个答案是正确的轨道上,但在init()方法银河系中的控制器不能以这种方式访问,因为它可以说是控制器的设置。 – Zauberfisch
啊好吧谢谢,我会测试它,让我们看看会发生什么 @Zauberfisch所以我只需要重命名这个功能? – invictus
我已经写了一个完整的答案,我认为它应该涵盖这个问题,如果不是,请随时再次提问 – Zauberfisch
我认为正确的方式做,这是创建这样一个php文件控制台:
#!/usr/bin/env php
<?php
require_once "/path/to/your/class/Update.php";
$class = new Update();
$class->init();
权烫发添加到该文件
chmod 755 consolefile
最后又用的cronjob运行此脚本
为什么不创建构建任务?这是专门为这样的需求而设计(AT-至少这就是我认为建立任务)
<?php
class ArticleCsvUpdateTask extends BuildTask {
protected $title = 'Article Csv Update';
protected $description = 'Build task for article Csv update';
public function run($request) {
$loader = new ArticleCsvBulkLoader('Color');
if($loader->load('import-new.csv')) {
$loader->load('import-new.csv');
}
}
}
哪些可以同时评估使用使用“yoursite的/ dev /任务/ ArticleCsvUpdateTask”,并在命令行中的浏览器“ php framework/cli-script.php dev/tasks/ArticleCsvUpdateTask“或者使用”sake dev/tasks/ArticleCsvUpdateTask“(如果您安装了清酒)。
可能是我没有得到您的确切要求,但我相信这是更清洁和更好的银行运行cron作业的方式。
你可以做到这一点没有银条纹。安装卷曲,并通过一个cronjob调用的URL,即:
0 0 * * * curl --silent http://tld.de/Update
正确的方式做,这将是写一个Silverstripe任务,从任务中调用您的控制器。我没有测试代码,但它会去是这样的:使用
class YourTask extends BuildTask {
public $description = "...";
//...
public function run($request) {
YourController::init();
}
}
您可以调用过来的缘故:
0 0 * * * /path/to/framework/sake dev/tasks/YourTask
喜zauberfisch,我试图运行一个开发/通过ssh终端建立等你告诉以上,但我收到以下错误=>'X供电-通过:PHP/4.4.9 内容类型:文本/ HTML
解析错误:语法错误,意想不到的T_OBJECT_OPERATOR在_testpage /框架/核心/ core.php中上线
“如果我使用/ usr/local/bin目录/ php54 ......我陷在登录消息,如果我使用php-cli。腻子告诉我,该命令没有找到 – invictus
好吧,第一个错误信息显然是一个错误,因为从低到PHP版本。使用像php54一样的新php版本是解决方案。但我不明白你的意思是“卡在登录消息” – Zauberfisch
,如果页面不处于开发模式,我收到以下输出 - > http://www.sspaste.com/paste/show/5256860510ca9我认为我需要以某种方式登录,但是如何? – invictus