我有一個網站抓取腳本,存儲數據到少數MySQL表中。主表中的記錄是從其他記錄引用的。腳本需要大約5個小時才能執行,但大約70分鐘後它會停止工作(set_time_limit()設置爲c)。我試圖從瀏覽器和cron運行它,結果是一樣的。任務劃分爲一個PHP腳本
由於腳本在隨機時間停止,因此可能導致數據庫不一致。主表記錄可以被存儲,但是不存在從屬表使用來自主表的mysql_insert_id()記錄。
當運行腳本時,有沒有比刪除主表中最後一條記錄和從其他表中刪除最後一條記錄更好的方法?
我有一個網站抓取腳本,存儲數據到少數MySQL表中。主表中的記錄是從其他記錄引用的。腳本需要大約5個小時才能執行,但大約70分鐘後它會停止工作(set_time_limit()設置爲c)。我試圖從瀏覽器和cron運行它,結果是一樣的。任務劃分爲一個PHP腳本
由於腳本在隨機時間停止,因此可能導致數據庫不一致。主表記錄可以被存儲,但是不存在從屬表使用來自主表的mysql_insert_id()記錄。
當運行腳本時,有沒有比刪除主表中最後一條記錄和從其他表中刪除最後一條記錄更好的方法?
您可以將所有查詢包裝在一個事務中的給定記錄中,並在最後提交。這樣,如果腳本中途通過一組查詢,這些更改將被回滾並且數據將保持一致。
第一件事:你檢查了mysql連接的TTL嗎?也許這就是導致問題的原因?
如果此問題不斷彈出,您可能需要考慮使用PDO創建數據庫適配器對象,您可以簡單地使用:$db->beginTransaction();
啓動腳本,並通過提交$db->commit();
來完成更改(如果一切順利)。
這種方法有很多優點,其中主要是$db->rollBack();
萬一出現了問題。另一個好處是,當MySQL發生錯誤時,PDO類將拋出一個PDOException
對象,因此您可以執行回滾,以確保沒有損壞的數據寫入您的數據庫並以某種方式退出,類似於此die($e->getMessage());
看看究竟出了什麼問題。
查看PDO man-page的信息
你的意思是mysql.connect_timeout?這是設置爲60.交易看起來像你最好的路要走。 – user965748
謝謝。這種方法是最好的。 – user965748