web-dev-qa-db-ja.com

バッチ処理を停止できますか

なんらかのエラーが発生した場合にバッチプロセスを強制的に停止する方法はありますか?特に、レコードをデータベースに保存することから始まるバッチがあります。後続の各バッチ操作は、データベースの挿入が正しく機能していることに依存しています。最初のバッチが失敗した場合、バッチを強制的に停止したいと思います。

バッチはこのように呼ばれます

$batch = array(
    'operations' => $operations,
    'finished' => 'mymodule_batch_finished',
    'title' => t('Merging records'),
    'init_message' => t('Starting processing'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('Processing has encountered an error'),
    'file' => drupal_get_path('module', 'mymodule') . '/forms/mymodule.inc'
);

ここで、$operationsは呼び出す関数の配列です。

各関数はPDOを使用してデータベースを更新します。現在の操作のクエリが失敗した場合に、後続の$operationsが呼び出されないようにする方法を見つけようとしています。

try {
  $sth = $dbh->prepare($sql);
  $sth->bindParam(':newid',$new_id,PDO::PARAM_INT);
  $sth->bindParam(':id',$id,PDO::PARAM_INT);
  if($sth->execute()) {
    $context['results']['[] = $sth->rowCount();
  }
  else {
    // TODO: stop processing due to an error
  }
}
catch(PDOException $e) {
  // TODO: stop processing due to an error
}

エラーが発生した場合は、残りの操作をバイパスしてmymodule_batch_finishedに直接進みます

7
Robbert

バッチ処理を行うバッチコールバック内で、$context['finished']1に設定できる必要があります。これにより、Drupalにバッチが完了したことが通知されます。

したがって、あなたの場合:

$error = FALSE;
try {
  $sth = $dbh->prepare($sql);
  $sth->bindParam(':newid',$new_id,PDO::PARAM_INT);
  $sth->bindParam(':id',$id,PDO::PARAM_INT);
  if($sth->execute()) {
    $context['results'][] = $sth->rowCount();
  }
  else {
    $error = TRUE;
  }
}
catch (PDOException $e) {
  $error = TRUE;
}
// If there was an error, immediately complete the batch process.
if ($error) {
  $context['finished'] = 1;
}

さらに、$contextでエラーメッセージを渡すこともできます。これは、完了したコールバックで確認し、失敗した場合にエンドユーザーに表示できます。

すぐに$operationsリスト内の他のコールバックの処理を停止したい場合は、各コールバックの開始。エラー状態の場合はコールバックをスキップします。 variable_get/variable_set、またはページリクエスト間で持続するその他のメカニズムを使用してみてください。ただし、これは間違いなくハック/ラストリゾートソリューションです。

以下も参照してください。

14
geerlingguy

以下のコードを試すことができますか?

$result = array('status' => FALSE, 'data' => $message);
die(json_encode($result));
0
Anil Sagar