嗨我想通過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