22

cronjob コントローラーを作成しようとしているので、1 つの Web サイトを呼び出して、すべてのモジュール cronjob.php を実行できます。今私の問題は、どうすればそれを行うことができますか?

curl はオプションなので、エラーと成功を数えることもできますか?

[アップデート]

私はそれを十分に説明していないと思います。

私がやりたいことは、http://server/cronjobのように呼び出すことができる 1 つのファイルを用意して、すべての /application/modules/*/controller/CronjobController.php を実行させるか、別の方法で実行することです。 cronjobs は 1 つの場所ではなく、モジュールが配置されている同じ場所にあります。これは、モジュールが存在しない場合、その cronjob を実行しようとしないという利点があります。

ここで私の質問は、すべてのモジュール CronjobController をどのように実行しますか、それとも完全に異なる方法で実行して、モジュールを維持しますか?

そして、正常に実行された cron ジョブと実行されなかった cron ジョブの数を明らかにしたいと考えています。

4

13 に答える 13

12

いくつかの調査と多くの先延ばしの後、ZF 化された cron スクリプトには、zend フレームワーク アプリのすべての機能を含める必要があるという単純な結論に達しました。アプリケーション ディレクトリに新しい cronjobfoo.php ファイルを作成することで、これを実現しました。それから私は最低限のものを取りました: -私のフロントコントローラー(index.php) -私のbootstrap.php

私はすべてのビューのものを取り出し、環境のセットアップ、データベースのセットアップ、オートローダー、およびレジストリのセットアップを維持することに集中しました。ドキュメント ルート変数を修正し、ブートストラップからコピーした OO 機能の一部を削除するのに少し時間がかかりました。

その後、コードを書きました..私の場合は、毎晩のレポートをコンパイルして電子メールで送信していました。Zend_Mail を使用できてよかったです。スクリプトが意図したとおりに機能することを確信したとき、それを crontab に追加しました。

幸運を!

于 2009-07-16T15:31:48.643 に答える
7

cron ジョブは通常の時間外にトリガーされ、実行内容によっては問題が発生する可能性があるため、cron ジョブを一般に公開することには注意が必要です (意図していないことはわかっていますが、実際のコントローラーに配置することで到達可能になります)。ブラウザから)。たとえば、電子メールを送信する cron が 1 つあります。誰かが cron の URL を見つけてそれを叩き始めたら、私は絶え間なくスパムを受けます。

私がしたことは、cronフォルダーを作成し、そこにZend Framework(マイナスMVC)をブートストラップするheartbeat.phpを作成することでした。インストールされているすべての cron ジョブのリストを含むデータベースをチェックし、実行する時間になった場合、cron ジョブのクラスのインスタンスを生成して実行します。

cron ジョブは、install()、run()、deactivate() などのメソッドを持つ抽象 cron クラスの単なる子クラスです。

仕事を開始するには、5 分ごとに実行され、heartbeat.php にヒットする単純な crontab エントリを用意するだけです。これまでのところ、2 つの異なるサイトでうまく機能しています。

于 2008-09-27T13:44:35.607 に答える
3

数日前に fw-general ( Zend Framework を使用するときに読むことをお勧めするメーリングリスト) でこのブログ エントリについて誰かが言及しました。

Zend_Controller_Request_Cliの提案もあり、遅かれ早かれこれに対処する必要があります。

于 2008-09-27T14:42:32.207 に答える
3

私は専用サーバーにアクセスでき、最初は cron ジョブ用に別のブートストラップを使用していました。私は最終的にこのアイデアを嫌い、既存の MVC セットアップ内でこれを行うことができ、物事を移動することを気にする必要がないことを望んでいました。

ファイル cron.sh を作成し、サイトのルート (パブリックではない) 内に保存し、その中に実行したい一連のコマンドを入れました。一度に多くのコマンドを実行したかったので、通常どおりコントローラー内に PHP を記述し、cron.sh 内のそれらの URL に curl 呼び出しを追加しました。たとえば、curl http://www.mysite.com/cron_controller/action次にcronインターフェースで実行しましbash /path/to/cron.shた。

他の人が指摘したように、あなたのcronはURLを推測する人なら誰でも起動できるので、常にその警告があります。それに対する解決策は、さまざまな方法で見つけることができます。

于 2011-11-11T17:35:00.120 に答える
1

見てみましょうzf-cli

これにより、すべての cron ジョブが適切に処理されます。

于 2010-12-18T11:29:34.950 に答える
0

私はこの投稿でgregorの回答を拡張しました。これが出てきたものです:

//public/index.php 

// Run application, only if not started from command line (cli)
if (php_sapi_name() != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) {
    $application->run();
}

gregorに感謝します!

于 2011-01-13T01:32:03.690 に答える
0

(モジュール内の)cronjobスクリプトへの参照を保持するようにデータベーステーブルを設定してから、合格/不合格時に戻り値を指定してexecコマンドを使用できます。

于 2008-09-28T02:30:04.703 に答える
0

モジュールのディレクトリへのファイルシステム アクセス権はありますか? ディレクトリを反復処理して、CronjobController.php が利用可能な場所を特定できます。次にZend_Http_Client、HTTP 経由でコントローラーにアクセスするか、次のようなアプローチを使用できZend_Test_PHPUnitます。実際のディスパッチ プロセスをローカルでシミュレートします。

于 2008-09-27T19:01:23.753 に答える
0

これは、Zend Framework で Cron ジョブを実行する私の方法です

Bootstrapでは、MVC を差し引いた環境設定を維持します。

public static function setupEnvironment()
{
     ...
     self::setupFrontController();
     self::setupDatabase();
     self::setupRoutes();
     ...
     if (PHP_SAPI !== 'cli') { 
          self::setupView();
          self::setupDbCaches();
     }
     ...
}

また、Bootstrap で setupRoutes を変更し、カスタム ルートを追加します。

public function setupRoutes()
{   
    ...
    if (PHP_SAPI == 'cli') { 
        self::$frontController->setRouter(new App_Router_Cli());
        self::$frontController->setRequest(new Zend_Controller_Request_Http());        
    }
}

App_Router_Cliは、このタイプのリクエストに基づいてコントローラー、アクション、およびオプションのパラメーターを決定する新しいルーター タイプですscript.php controller=mail action=send。ここでこの新しいルーターを見つけました: Zend Framework 1.11 で Cron をセットアップする :

class App_Router_Cli extends Zend_Controller_Router_Abstract 
{
    public function route (Zend_Controller_Request_Abstract $dispatcher) 
    {
        $getopt = new Zend_Console_Getopt (array());
        $arguments = $getopt->getRemainingArgs();
        $controller = "";
        $action = "";
        $params = array();

        if ($arguments) {

            foreach($arguments as $index => $command) {

                $details = explode("=", $command);

                if($details[0] == "controller") {
                    $controller = $details[1];
                } else if($details[0] == "action") {
                    $action = $details[1];
                } else {
                    $params[$details[0]] = $details[1];
                }
            }

            if($action == "" || $controller == "") {
                die("Missing Controller and Action Arguments == You should have: 
                     php script.php controller=[controllername] action=[action]");
            }
            $dispatcher->setControllerName($controller);
            $dispatcher->setActionName($action);
            $dispatcher->setParams($params);

            return $dispatcher;
        }
        echo "Invalid command.\n", exit;
        echo "No command given.\n", exit;
    }

    public function assemble ($userParams, $name = null, $reset = false, $encode = true)
    {
        throw new Exception("Assemble isnt implemented ", print_r($userParams, true));
    }
}

CronControllerでは、簡単なチェックを行います。

public function sendEmailCliAction()
{   
    if (PHP_SAPI != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) { 
        echo "Program cannot be run manually\n";
        exit(1);
    } 
    // Each email sent has its status set to 0;

Crontab は次のようなコマンドを実行します。

    * * * * * php /var/www/projectname/public/index.php controller=name action=send-email-cli >> /var/www/projectname/application/data/logs/cron.log
于 2012-07-27T11:36:50.167 に答える