4

こんにちは、cronjob を介して関数を実行して、csv インポートを開始したいと考えています。現時点では、ブラウザー tld.de/Update でコントローラーにアクセスすることによってインポートがトリガーされます。

コントローラーにはこのコードがありますhttp://pastie.org/8351266

Cronjob 経由で関数 init()を実行するにはどうすればよいですか?

どうも!

4

5 に答える 5

5

SilverStripe では、コマンド ラインで cli-script.php を実行することにより、HTTP 経由でアクセス可能な任意のルートにアクセスできます。

sakecli-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()呼び出すことができます

于 2013-09-24T10:18:56.000 に答える
5

これは、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
于 2013-09-24T23:37:22.293 に答える
2

なぜビルドタスクを作成しないのですか? これは、そのような要件のために特別に設計されています (少なくとも、私はビルド タスクをそのように考えています)。

<?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ジョブを実行するためのよりクリーンで優れた方法だと思います.

于 2013-09-24T19:09:19.707 に答える
1

完全な解決策については、Zauberfisch の回答を参照してください。

私は Silverstripe に詳しくありませんが、正しく理解していれば、このコントローラーinit関数は HTTP 要求で呼び出すことができます。

silverstripe のドキュメントにあるように、コマンド ラインから任意の URL を呼び出すことができます。

php framework/cli-script.php Update/init

詳細については、こちらsakeを参照してください。このタスクでの使用を検討してください。

于 2013-09-24T09:52:25.863 に答える
0

これを行う正しい方法は、次のようなphpファイルコンソールを作成することだと思います:

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

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

このファイルに適切なパーマを追加します

chmod 755 consolefile

最後に、このスクリプトを cronjob で実行します

于 2013-09-24T10:01:05.220 に答える