PHPタイムアウトでのバッチの動作


9

Drupal 7のドキュメントでは、Batch APIを次のように紹介しています。

フォーム処理を複数のページリクエストに分散できるようにする関数。これにより、PHPタイムアウトが原因で処理が中断されないようにします...

これは、Batchが開発者のタイムアウト関連の問題を処理することを意味すると解釈しました。

ただし、他の投稿(つまり、バッチAPIは内部でどのように機能するのですか?)は、別のユーザーが到着してBatchが再び呼び出されるのを待つ前に、Batchにどれだけの作業を行わせるかを開発者の責任で行うことを意味します。タイムアウト。

後者の場合は、バッチがジョブのタイムアウトを保証しないことを想定しています。Batchは保証を提供しますか?タイムアウトする前にBatchが処理できる量を推測するのは開発者の責任ですか?

ありがとうございました!


3
これはかなり気の利いた質問です、ありがとうございます:-)
Chapabu 2013

回答:


5

バッチは単に「私は(せいぜい)N個のことを行い、次にページの更新を行います...そしてさらに多くのことを行います」と言います。

ジョブチャンクごとに5項目を実行し、それぞれに5秒かかるとすると、デフォルトのphpタイムアウト値は30秒​​で問題ありません。

ジョブチャンクごとに20項目を実行し、それぞれに5秒かかるとすると、リクエストごとのワークロードが高すぎてタイムアウトになる可能性があります。

PHPでのページのライフサイクルがである場合を思い出してくださいrequest in -> response out。そして、あなたのウェブサーバーは、各スレッドを有限時間の間生き続けます。そのタイムアウトを回避する必要があります。これは、Batch APIが役立ちます。

言うDrushからのものを実行し、サーバー側でMigrateなどのコミュニティモジュールを使用すると、必要に応じてタイムアウトを完全に回避できます。

編集

また、すべてのページ要求は完全なdrupalブートストラップであり、Batch APIは中断したところから開始することを覚えておいてください。これは、Batch APIを使用してN個のアイテムごとにdrupalを再ロードする場合、最もコストのかかる操作の1つです。そのため、ノードを作成したり、コンテンツをインポートしたりするために、サーバー側の技術に人々が取り組んできました。バッチAPIは、単純で反復的なタスクに最適です。ただし、複雑なデータセットまたは非常に大規模なデータセットのいずれかでばらばらになる傾向があります。


1
Batchはページが読み込まれるたびに呼び出されると言っていますか。すなわち。バッチが起動して、タスク(poorman's cronなど)があるかどうかを確認しますか?これは疑われました。ただし、プロセスの計算コストを強調した理由がわかりません。追加のコストは、数回の比較と、Batchがキューに持っているすべての作業ではなく、Batchは、ページをロードしてそれ自体を呼び出すような特別なことをしていますか?
トースター2013

1
以下のkiamlalunoの回答を参照してください。バッチプログレスバーページは、X秒後に自動的に再読み込みされます。[ネットワーク]タブでFirebugまたはChromeをロードしてBatch APIジョブを実行すると、URLを見ると、同じページが呼び出され、異なるアイテムオフセットとチャンクサイズで呼び出されていることがわかります。すべてのdrupalのすべての単一ページ要求をブートストラップする計算コストは​​高額です。たとえば、Drush sqlインポートを実行すると、drupalが1回だけロードされます。大きなデータセットと問題の場合、Batch APIのオーバーヘッドが高くなりすぎます。
テンケン2013

3

バッチAPIは_batch_shutdown()、シャットダウン関数としてに登録するだけregister_shutdown_function()です。この関数は、実行中のバッチの現在の状態をデータベーステーブルに保存するだけです。
Batch APIは、実行中の操作が途中で中断されないことを保証しません。そのため、バッチ操作は通常、テーブルの保存からデータベース行を読み取る、データベース行を別のテーブルに保存するなどの単純な操作を実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.