web-dev-qa-db-ja.com

symfony2アクションをスケジュールする方法のベストプラクティス

Symfony2に基づく私のアプリケーションは、さまざまな瞬間とさまざまな頻度でいくつかのスタンドアロンジョブを実行する必要があります。たとえば、ニュースレターの送信、レポートの編集...

アプリケーションから各タスクを追加/編集できるようにしたい私のタスクはcronジョブに非常に近く、特定のURLを呼び出すことで構成されます。

私の視点から :

30分または10分ごとにスクリプトを起動するcronジョブを作成することを考えています。このスクリプトは、curlコマンドでドクロンジョブアクションを取得するだけです。このdocronjobactionはsymfonyの内部にあり、すべてのタスクを取得して、必要なタスクを起動する責任があります。

私の質問は:

  • それを達成するためのよりクリーンな方法はありますか?
  • Docronaction内で、他のアクションを起動するにはどうすればよいですか?
  • コントローラ全体の制限時間を0に設定するにはどうすればよいですか?
  • これを行うバンドルはすでに存在しますか?
15
0x1gene

タスクのスケジュールをデータベースに保存しているようです。問題ない。さまざまな種類のタスク(ニュースレターの送信、レポートの保存など)ごとに、タスクを実行するサービスを作成します。次に、このサービスにタグ(twig.extension、 ただし独自の など)を追加すると、すべてのタスクを認識しているTaskChainのようなものができます。

実行の場合 コンソールコマンドの作成 、データベースからスケジュールを取得し、TaskChainをロードして、タスクを実行します。このコンソールコマンドは、Webに公開せずに、cronjobから簡単に呼び出すことができます。実際、ブラウザからではなくphp-cliを介してこのコマンドを呼び出しているため、標準の制限時間は無制限です。実行にコントローラーを関与させる必要はありません。

これはすべて、追加のTaskBundleにまとめる必要があります。

16
Emii Khaos

このブログ を使用して、やりたいことができます。次に、cronまたはその他のプログラムを使用してアクションをトリガーできます。

要約すれば:

まず、必要な機能を実行するsymfonyコマンドを作成する必要があります。そのために、バンドル内に「コントローラーまたはリソース」と同じレベルの「コマンド」という名前のフォルダーを作成し、クラスに名前を付けます。名前は「コマンド」で終わる必要があります。そうでない場合は機能しません。それを「MyCommand」と呼びましょう。

    <?php
    namespace Devvness\DevvnessBundle\Command;

    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;

    class MyCommand extends ContainerAwareCommand
    {


 protected function configure()
    {
        $this->setName('devvness:my_command')
            ->setDescription('Descripción de lo que hace el comando')
            ->addArgument('my_argument', InputArgument::OPTIONAL, 'Explicamos el significado del argumento');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $em = $this->getContainer()->get('doctrine')->getManager();
        // Hacemos lo que sea
        $output->writeln('Hola mundo');
        $em->flush();
    }
}

次に、cmdまたはconsoleで実行して呼び出すことができます。

php app/console devness:mycommand 

または

php app/console devness:mycommand --my_argument=valor

次に、cronファイルを編集して、UNIX用のcronなどでタスクをスケジュールする必要があります。

* * * * * php /root/absolute/for/symfony/project/app/console devness:mycommand --myargument=valor
5
Rodolfo Velasco

管理するコマンドがたくさんあるアプリケーションで作業しているときに、非常によく似たニーズがありました(そのため、この古いトピックを見つけました)。

私はついに、複数のsymfonyコマンド(Doctrineを介して保存されたスケジュールされたタスク)の実行とキューイングを管理するための独自のバンドルを作成しました。

これがGitリポジトリです: CommandSchedulerBundle

私はそれが誰かを助けることを願っています。

宜しくお願いします

3
j-guyon

試してみてくださいJmsJobQueueドキュメント )これを処理できます:

  • リストアイテム
  • Symfonyコンソールコマンドの実行、
  • データベースからジョブを読み取る、
  • ジョブスケジューリング、
  • キューサイズ、
  • 複数のキュー、
  • ジョブの依存関係(チェーンロジック)、
  • リアルタイムの監視とフィルタリングのためのWebページ、
  • ジョブの詳細(Webページ)でのコマンド出力、
  • コマンド統計。
1
Takman