【问题标题】:Task dividing for a PHP scriptPHP脚本的任务划分
【发布时间】:2026-01-12 20:55:01
【问题描述】:

我有一个网站抓取脚本,它将数据存储到几个 MySQL 表中。主表中的记录是从其他记录中引用的。该脚本需要大约 5 小时才能执行,但它总是在大约 70 分钟后停止工作(set_time_limit() 设置为 c)。我尝试从浏览器和cron运行它,结果是一样的。

由于脚本在随机时间停止,可能会导致数据库不一致。可以存储主表记录,但不能使用主表中的 mysql_insert_id() 存储从表记录。

有没有比在运行脚本时从主表中删除最后一条记录以及从其他表中删除该行的所有引用记录更好的方法?

【问题讨论】:

    标签: php mysql scheduled-tasks division


    【解决方案1】:

    第一件事:你检查过 mysql 连接的 TTL 吗?也许这就是导致问题的原因?

    如果这个问题不断出现,你可能想看看使用 PDO 创建一个 db 适配器对象,你可以简单地用 $db->beginTransaction(); 启动脚本,然后通过 @987654323 提交更改来结束(如果一切顺利) @。

    这种方法有很多优点,其中最主要的是$db->rollBack();,以防出现问题。另一个优点是,当 MySQL 端确实发生错误时,PDO 类会抛出一个PDOException 对象,因此您可以进行回滚,以确保不会将损坏的数据写入您的数据库并以某种方式退出,类似于此die($e->getMessage()); 看看到底出了什么问题。

    查看PDO man-page 了解信息

    【讨论】:

    • 你的意思是mysql.connect_timeout吗?设置为 60。交易看起来是最好的方式。
    【解决方案2】:

    您可以将对给定记录的所有查询包装在事务中,并在最后提交。这样,如果脚本在一组查询中途终止,更改将被回滚并且数据将保持一致。

    【讨论】:

    • 谢谢。这种方法最好。