2013-09-24 90 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