【问题标题】:Indefinitely running PHP script, MySQL timeout无限期运行 PHP 脚本,MySQL 超时
【发布时间】:2012-09-11 04:21:41
【问题描述】:

我有一个无限期运行的 PHP 脚本,每 5-10 秒执行一次特定任务(一个 do-while 循环,在每次迭代结束时检查数据库以确定它是否应该继续)。此任务包括 MySQL 数据库查询。处理数据库连接的最佳方法是什么?我应该:

a.) 每次迭代都断开连接然后重新连接到数据库?

b.) 将连接超时设置为无限期?

c.) ping 数据库以确保我仍然连接,并在执行和查询之前在必要时重新连接?

d.)还有别的吗?

编辑:澄清一下,脚本向用户的 iPhone 发送推送通知。

【问题讨论】:

  • 你在每次迭代中都在做什么?为什么不使用计划任务/cron 作业来连续执行脚本?
  • 旁注:我建议使用 cron 作业而不是 while..do! b)永远不要这样做
  • 我建议您将 PHP 脚本包装在启动器脚本中,并简单地让它在数据库连接错误时以受控方式终止。启动器脚本自然应该重新启动它。
  • 我正在使用IMAP 库来检查新电子邮件,然后在存在新电子邮件时发送推送通知。我需要在每次迭代后访问数据库以更新用户数据。我觉得这种方法不是最有效的——你能提出替代方案吗?无论哪种方式,脚本都需要同时为多个用户运行,并且需要以这些相当快的间隔运行。这是否或多或少排除了使用 cron 作业的可能性?
  • @James 启动器脚本可以是 PHP 甚至更好的 shell 脚本。作为 SysV 初始化脚本的 shell 脚本允许您在操作系统启动时完全按照其他方式运行它——我经常使用它。如果它消失了,您已经必须重新建立数据库连接,所以这没有开销。关于 IMAP 连接:我非常确定,与在 IMAP 上完成的实际工作相比,这可以忽略不计。

标签: php mysql


【解决方案1】:

您不能将 PHP 脚本作为守护程序运行的建议是荒谬的。我已经做了好几次了,而且效果很好。有some example code to get you started。 (需要 PEAR...如果您不是粉丝,请自己动手。)

现在,谈谈您的实际问题。如果您进行常规查询,您的 MySQL 连接不会超时。该超时适用于空闲连接。绝对保持连接......没有理由断开和重新连接的开销。无论如何,在数据库失败时,由于您的脚本作为守护程序运行,您可能不想立即终止该进程。

我建议处理异常并重新连接。如果您的重新连接失败,请稍候再试一次。在几次失败(无论是什么适当的)之后,您可能会在那时终止该进程,因为某些东西可能已损坏,需要人工干预。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多