我有一个网站抓取脚本,将数据存储到少数MySQL表中。主表中的记录是从其他记录中引用的。该脚本需要大约5个小时才能执行,但它在大约70分钟后总是停止工作(set_time_limit()设置为c)。我试图从浏览器和cron运行它,结果是一样的。
由于脚本在随机时间停止,因此可能导致数据库不一致。可以存储主表记录,但不能使用主要表中的mysql_insert_id()存储从属表记录。
有没有比在运行脚本时从主表中删除最后一条记录以及从其他表中删除所有引用记录更好的方法?
答案 0 :(得分:2)
您可以在事务中包装给定记录的所有查询,并在最后提交它。这样,如果脚本在一组查询中途中断,则将回滚更改并保持数据一致。
答案 1 :(得分:1)
首先要做的事情是:你检查过mysql连接的TTL吗?也许这就是造成这个问题的原因?
如果此问题不断出现,您可能希望查看使用PDO创建数据库适配器对象,您只需使用以下命令启动脚本:$db->beginTransaction();
并通过提交更改结束(如果一切顺利) $db->commit();
。
这种方法有许多优点,其中最主要的是$db->rollBack();
,以防出现问题。另一个优点是,当MySQL端发生错误时,PDO类会抛出一个PDOException
对象,因此您可以执行回滚,以确保没有损坏的数据写入数据库并以某种方式退出,类似到这个die($e->getMessage());
看看究竟出了什么问题。
检查PDO man-page以获取信息