0

次のジョブを実行する cron ジョブ (PHP スクリプト) を設定しました。

1. Read all of the unseen emails, using imap
   1.1  For each email readed
   1.2. Fetches the details and save detail in database
   1.3. Moves email to other mailbox named "Processed"
   1.4. Goto step 1.1

しかし、ステップ 1.2 の後、ステップ 1.3 の前にPHP スクリプトが停止または実行に失敗した場合、メールは再処理されます。これが問題です。

ご存知のように、処理時間はサーバーの負荷や処理するメールの数などの多くの要因に依存するため、max_execution_time の設定が役立つとは思いません。

これをアトミックにするにはどうすればよいですか?何か案は?(別のプロセス フローについてのアイデアがあれば、プロセス フローも変更できます)。

編集:電子メールが移動し、コミットしようとしていたが、PHP スクリプトが停止したとします。その場合、レコードが保存されずに電子メールが移動します。

4

1 に答える 1

0

ステップ 1.2 をデータベース トランザクションに入れることができます。ステップ 1.3 が失敗した場合は、トランザクションをロールバックします。

トランザクションがあり、「コミット」が明示的に呼び出されていない場合 (つまり、タイムアウトを介して、またはコミットを呼び出すのを忘れただけ)、自動的にロールバックすると見なされます。

于 2012-10-12T17:51:15.040 に答える