web-dev-qa-db-ja.com

フィード-バックグラウンドプロセスとバッチAPI

フィードを使用して、中規模のノードを毎日インポートしています。 cron設定を微調整するために、Elysia cronを使用しています。

これが私の流れです:

  1. 毎日午前2時にcronタスクがトリガーされます
  2. このタスクは、その設定からファイルのリストをロードし、これらのファイルごとに、次の呼び出しによってフィードのインポートをトリガーします。
$myFeed->startImport()

このstartImportメソッドを見ると、次のようなものが表示されます。

public function startImport() {
    module_invoke_all('feeds_before_import', $this);
    $config = $this->importer->getConfig();
    if ($config['process_in_background']) {
      $this->startBackgroundJob('import');
    }
    else {
      $this->startBatchAPIJob(t('Importing'), 'import');
    }
}

したがって、Feedsインポーターを呼び出す方法は2つあります。BackgroundJOB api(これはおそらく https://drupal.org/project/background_process )とBatch API( https://drupal.org/node/180528 )。

フィードインポーターをcronタスクから開始しているため、このシナリオにはどちらが適していますか?

Batch APIの拡張機能としてバックグラウンドプロセスを見ることができますか?

6

私はこのコードを掘り下げてきましたが、フィードでは Background Process を使用していません。

Job Scheduler を使用します

FeedsSource.incから:

  /**
   * Background job helper. Starts a background job using Job Scheduler.
   *
   * Execute the first batch chunk of a background job on the current page load,
   * moves the rest of the job processing to a cron powered background job.
   *
   * Executing the first batch chunk is important, otherwise, when a user
   * submits a source for import or clearing, we will leave her without any
   * visual indicators of an ongoing job.
   *
   * @see FeedsSource::startImport().
   * @see FeedsSource::startClear().
   *
   * @param $method
   *   Method to execute on importer; one of 'import' or 'clear'.
   *
   * @throws Exception $e
   */
  protected function startBackgroundJob($method) {
    if (FEEDS_BATCH_COMPLETE != $this->$method()) {
      $job = array(
        'type' => $this->id,
        'id' => $this->feed_nid,
        'period' => 0,
        'periodic' => FALSE,
      );
      JobScheduler::get("feeds_source_{$method}")->set($job);
    }
  }

Job Schedulerはcronを使用してジョブを完了するため、すでにcronから呼び出している場合は、何も保存されていません。

コアDrupal Batch API は、AJAX=を使用してジョブをバッチに分割します。cronからBatch APIバッチを開始することはできません。JSがなく、コアAPIを使用してバッチを開始しようとした場合でも、プログレスバーが画面上を移動するのを監視する必要があります。バッチ中にブラウザを放棄すると、ブラウザが機能しなくなります。

上記の以前に受け入れられた回答の状態とは異なり、コアバッチAPIはそうではありませんcronを使用します

バックグラウンドプロセス はモジュールのスイートになり、バッチAPIモジュールが含まれるようになりました。これらは、ジョブスケジュールモジュールに関連しない2つの個別のモジュールです。バックグラウンドジョブ/プロセスを1つのものとして参照することはできません。これらは2つの無関係なモジュールです。

主な違いは次のとおりです。

Drupal Batch APIは、ブラウザーを使用してサーバーに新しいリクエストを定期的に送信します。これはcronジョブからは機能しません

Job Schedulerは、cronを使用して、cronの実行中に一連のスケジュールされたジョブを呼び出します。 cronの実行中にプロセスを実行できる時間には制限があるため、これは長時間実行されるプロセスには理想的ではありません。また、cronジョブが夜間のみ実行されている場合に、インポートをタイムリーに実行する必要がある場合も適切ではありません。 cronの実行中に新しいジョブをスケジュールすると、ジョブが実際にディスパッチされるのは次のcronの実行までではない可能性があるため(hook_cron()job_scheduler_cron()の前または後に呼び出されるかどうかによって異なります)

Background process/Background Batchは、サーバー側のhttpリクエストを使用してプロセスのステップをチェーンします。これは、すぐに開始する必要がある長期実行プロセスに最適です。このモジュールでhook_cron()から長時間実行プロセスを開始することもでき、完了するまで実行されます。

おそらく今はこの情報は必要ないでしょうが、私がGoogleからこのページを見つけたときにそうしました。

以前に受け入れられた回答で提供された情報は正しくないため、間違った方法を導きました。

10
tmsimont

私の下の応答は正しくありません。正確な概要については、承認された回答を参照してください。私はそこに残して、私の考えのプロセスを示しました。未来。

カイル


My nderstanding は、バックグラウンドジョブ/プロセスが軽量であり、ピーク時間に簡単に実行できることです。実行時間が長すぎる(所定)とタイムアウトになるため、興味深いことです。実際には、真のバックグラウンドプロセスモジュールではありません。ただし、Batch APIはCronからのジョブをできるだけ迅速に実行するだけです。ここではセマンティクスの例であり、どちらも同じ仕事であると思いますが、バックグラウンドジョブの動作は少し複雑です。個人的には、0200ではサイトでアクティビティがほとんどないため、バッチを介してインポートを実行します。ただし、この時点で負荷が高い(またはサーバーの処理能力が低い)場合は、バックグラウンドプロセス/ジョブをお勧めします。

これが役に立てば幸いです!

1
KyleM