2013-09-24 56 views

回答

5

在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()可以调用

+0

喜zauberfisch,我试图运行一个开发/通过ssh终端建立等你告诉以上,但我收到以下错误=>'X供电-通过:PHP/4.4.9 内容类型:文本/ HTML
解析错误:语法错误,意想不到的T_OBJECT_OPERATOR在_testpage /框架/核心/ core.php中上线
“如果我使用/ usr/local/bin目录/ php54 ......我陷在登录消息,如果我使用php-cli。腻子告诉我,该命令没有找到 – invictus

+0

好吧,第一个错误信息显然是一个错误,因为从低到PHP版本。使用像php54一样的新php版本是解决方案。但我不明白你的意思是“卡在登录消息” – Zauberfisch

+0

,如果页面不处于开发模式,我收到以下输出 - > http://www.sspaste.com/paste/show/5256860510ca9我认为我需要以某种方式登录,但是如何? – invictus

1

的完整解决方案

我不熟悉Silverstripe见Zauberfisch's answer,但如果我理解正确的话,该控制器init功能可以通过HTTP请求来调用。

由于silverstripe文档说,你可以调用命令行的任何网址:

php framework/cli-script.php Update/init 

更多信息,请here,并考虑使用sake这项任务。

+0

这个答案是正确的轨道上,但在init()方法银河系中的控制器不能以这种方式访问​​,因为它可以说是控制器的设置。 – Zauberfisch

+0

啊好吧谢谢,我会测试它,让我们看看会发生什么 @Zauberfisch所以我只需要重命名这个功能? – invictus

+0

我已经写了一个完整的答案,我认为它应该涵盖这个问题,如果不是,请随时再次提问 – Zauberfisch

0

我认为正确的方式做,这是创建这样一个php文件控制台:

#!/usr/bin/env php 
<?php 

require_once "/path/to/your/class/Update.php"; 
$class = new Update(); 
$class->init(); 

权烫发添加到该文件

chmod 755 consolefile 

最后又用的cronjob运行此脚本

+0

嗨,谢谢!但执行的cronjob i之后接收此错误
解析错误:语法错误,意想不到T_STRING,在 /kunden期待T_OLD_FUNCTION 或T_FUNCTION或T_VAR或 '}'/ XXXX /网络空间/ XXXX/mysite的/代码/ Update.php on line
invictus

+0

你是怎么执行这个脚本的? – Mauro

+0

顺便说一句,错误是在你的更新类。 – Mauro

2

为什么不创建构建任务?这是专门为这样的需求而设计(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作业的方式。

5

你可以做到这一点没有银条纹。安装卷曲,并通过一个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