こんにちは、cronjob を介して関数を実行して、csv インポートを開始したいと考えています。現時点では、ブラウザー tld.de/Update でコントローラーにアクセスすることによってインポートがトリガーされます。
コントローラーにはこのコードがありますhttp://pastie.org/8351266
Cronjob 経由で関数 init()を実行するにはどうすればよいですか?
どうも!
こんにちは、cronjob を介して関数を実行して、csv インポートを開始したいと考えています。現時点では、ブラウザー tld.de/Update でコントローラーにアクセスすることによってインポートがトリガーされます。
コントローラーにはこのコードがありますhttp://pastie.org/8351266
Cronjob 経由で関数 init()を実行するにはどうすればよいですか?
どうも!
SilverStripe では、コマンド ラインで cli-script.php を実行することにより、HTTP 経由でアクセス可能な任意のルートにアクセスできます。
sake
cli-script.php の単なる bash ラッパーもあります (ただし、sake をインストールする必要があります)。
したがって、プロジェクト ディレクトリから、同じアクションを実行する両方のコマンドを実行できます (この場合は、dev/build を実行します)。
php framework/cli-script.php dev/build
sake dev/build
Silverstripe のコマンドライン使用法については、ドキュメントを参照してください: http://doc.silverstripe.org/framework/en/topics/commandline
あなたの質問の2番目の部分(コントローラーからメソッドを呼び出す方法)は、実際にはシルバーストライプでのルーティングの問題であり、それがどのように呼び出されるか(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;
}
}
その後、run を呼び出して、次の結果を取得できますindex()
。
php framework/cli-script.php about
そして、これは次の結果を取得しますsomething()
:
php framework/cli-script.php about/something
注: init メソッド自体は URL 経由ではアクセスできません。アクションの前に実行されるのは「
セットアップ」です設定キャッシュをリロードします)index()
$allowed_actions
$allowed_actions
編集:これは実際には、コード例を見た後の最初の質問への回答でした。この追加:
スタンドアロンコントローラーの場合、ルートを定義する必要があるだけで、同じように機能し、ルートにあることを確認して、$Action
それをsomething()
呼び出すことができます
これは、Silverstripe 酒がなくてもできます。curl をインストールし、cronjob 経由で URL を呼び出します。
0 0 * * * curl --silent http://tld.de/Update
これを行う適切な方法は、Silverstripe タスクを作成し、タスク内からコントローラーを呼び出すことです。このコードはテストしていませんが、次のようになります。
class YourTask extends BuildTask {
public $description = "...";
//...
public function run($request) {
YourController::init();
}
}
以下を使用して、sake で呼び出すことができます。
0 0 * * * /path/to/framework/sake dev/tasks/YourTask
なぜビルドタスクを作成しないのですか? これは、そのような要件のために特別に設計されています (少なくとも、私はビルド タスクをそのように考えています)。
<?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/tasks/ArticleCsvUpdateTask 」を使用してブラウザーから評価することも、 「 php framework/cli-script.php dev/tasks/ArticleCsvUpdateTask」を使用してコマンドラインから評価することも、「ake dev/tasks/ ArticleCsvUpdateTask 」を使用して評価することもできます (日本酒がインストールされています)。
私はあなたの正確な要件を得ていないかもしれませんが、これはシルバーストライプでcronジョブを実行するためのよりクリーンで優れた方法だと思います.
完全な解決策については、Zauberfisch の回答を参照してください。
私は Silverstripe に詳しくありませんが、正しく理解していれば、このコントローラーinit
関数は HTTP 要求で呼び出すことができます。
silverstripe のドキュメントにあるように、コマンド ラインから任意の URL を呼び出すことができます。
php framework/cli-script.php Update/init
詳細については、こちらsake
を参照してください。このタスクでの使用を検討してください。
これを行う正しい方法は、次のようなphpファイルコンソールを作成することだと思います:
#!/usr/bin/env php
<?php
require_once "/path/to/your/class/Update.php";
$class = new Update();
$class->init();
このファイルに適切なパーマを追加します
chmod 755 consolefile
最後に、このスクリプトを cronjob で実行します