【问题标题】:PHP and windows scheduled taskPHP和windows定时任务
【发布时间】:2023-05-19 01:35:02
【问题描述】:

我正在使用 PHP,并设置了一些 Windows 计划任务来运行具有类似内容的 .bat 文件

"C:\PHP\php.exe" "C:\inetpub\wwwroot\cron\run-me.php"

在其中。这些都很好用,我已将任务设置为每 30 分钟运行一次。 'run-me.php' 文件包含检查记录结束日期的脚本,如果结束日期比现在短(脚本中还有很多功能,如发送电子邮件等),则它们会过期。同样,它们都工作得很好。

因为脚本仅每 30 分钟运行一次,所以我还希望在网站上有访问者时执行脚本,所以基本上在每个页面加载时,检查结束项目,使它们过期,继续加载以保持所有记录迄今为止。我在 windows 任务中执行的原因是因为可能有几个小时没有任何访问者,所以我需要使记录过期并发送电子邮件。

现在,我遇到的问题是,如果 windows 任务正在运行并且访问者重新加载页面,我会遇到双重脚本被执行,因为我经常收到内容相同的双重电子邮件。

我的 Windows 任务只允许执行单个实例,如果运行时间超过 5 分钟,它将被强制停止。

我的问题是:

  1. 我能否从我的 PHP 脚本执行 Windows 计划任务,以便只执行同一脚本的一个实例?
  2. 我在数据库中使用 MySQL,我是否应该锁定该行以使其他任何东西都无法对其执行任何操作,从而允许执行第一次访问记录的脚本?

【问题讨论】:

    标签: php scheduled-tasks


    【解决方案1】:

    使用事务应该可以解决问题。但是,我建议您只在 cron(或 windows 中的调度程序)中执行此操作,即使这意味着它每五分钟运行一次。

    【讨论】:

    • 您好,感谢您的建议。这是否意味着我删除了用户启动的脚本并仅从调度程序运行过期检查?这也意味着有一个 5 分钟的窗口可以在网站上查看过期记录,除非我添加 WHERE end_date > NOW 或正确的东西?在不了解额外配置的情况下,每 2 分钟运行一次脚本是否会产生太多开销?
    • 只要您不处理大量数据,就应该发现每两分钟运行一次。如果它只看几个过期一次,那应该没问题。此外,由于您过滤过期一次,因此您必须使用的记录总是有限的,所以应该没问题。
    • 谢谢。听起来不错。