1

いくつかのMySQLテーブルにデータを保存しているWebサイトスクレイピングスクリプトがあります。メインテーブルのレコードは、他のレコードから参照されています。スクリプトの実行には約5時間かかりますが、約70分後には常に動作を停止します(set_time_limit()はofcに設定されています)。ブラウザとcronの両方から実行しようとしましたが、結果は同じでした。

スクリプトはランダムに停止するため、データベースの不整合が発生する可能性があります。メインテーブルレコードは保存できますが、メインテーブルのmysql_insert_id()を使用して従属テーブルレコードを保存することはできません。

スクリプトの実行時に、メインテーブルから最後のレコードを削除し、他のテーブルからその行を参照しているすべてのレコードを削除するよりも良い方法はありますか?

4

2 に答える 2

2

特定のレコードに対するすべてのクエリをトランザクションでラップし、最後にコミットすることができます。そうすれば、スクリプトが一連のクエリの途中で停止した場合、変更がロールバックされ、データの一貫性が保たれます。

于 2012-05-04T18:35:14.713 に答える
1

まず最初に:mysql接続のTTLを確認しましたか?多分それが問題の原因ですか?

この問題が引き続き発生する場合は、PDOを使用したdbアダプターオブジェクトの作成を検討することをお勧めします。スクリプトを:$db->beginTransaction();で開始し、(すべてがスムーズに進んだ場合は)で変更をコミットして終了し$db->commit();ます。

このアプローチには多くの利点がありますが、その主$db->rollBack();なものは、問題が発生した場合に備えてです。もう1つの利点は、MySQL側でエラーが発生した場合、PDOクラスがPDOExceptionオブジェクトをスローするため、ロールバックを実行して、破損したデータがデータベースに書き込まれず、次のように終了することdie($e->getMessage());を確認できることです。正確に間違っていました。

詳細については、PDOのmanページを確認してください

于 2012-05-04T18:37:08.813 に答える