在特定时间运行PHP脚本的最佳方式是什么?


What is the best way to run a PHP script at a particular time?

我有一个网站,拍卖结束不同的时间。我需要发送自动电子邮件给卖方和买方拍卖完成后,通知他们拍卖结束和结果。显然,我不能真的等待有人加载页面运行脚本,所以是否有一个很好的方法来自动检查当前时间,并将其与拍卖结束的时间进行比较,并运行该脚本?

该站点位于UNIX服务器上,因此可以选择cron作业,但我担心运行这样的cron作业会给服务器带来相当大的负载。

cron作业每分钟最多运行一次。

它在服务器上生成的任何负载实际上取决于您要运行的脚本类型。顺便说一句,我假设您使用cli来运行脚本(而不仅仅是使用curl http://mysite.com)。

如果您的脚本耗时超过一分钟(您应该监控这一点),只需:

  • 增加运行之间的间隔时间或,
  • 使用一个锁文件来确保没有两个脚本实例可以同时运行。

    if (($fp = fopen('/tmp/mylockfile', "r+")) === false) {
        die("Could not open lock file");
    }
    if (!flock($fp, LOCK_EX | LOCK_NB)) {
        die("Could not obtain lock");
    }
    // run your code here
    // release the lock and close file
    fclose($fp);
    

如果脚本需要每分钟运行一次以上,则需要完全不同的机制。

问:在特定时间或间隔运行PHP脚本的最佳方式是什么?
A:使用cron

Q: cronjob会给服务器带来很大的负载吗?
答:这取决于你的剧本。但检查拍卖是否应该结束、结束拍卖并发送两封电子邮件应该不会太难。一定要创建某种锁文件,以确保如果您的脚本运行时间超过设置的时间间隔,它不会运行两次。

Q:运行时间间隔小于1分钟的脚本
A:这个问题我不能回答。对不起:)

使用Cron。它允许您每分钟最多运行一次任何命令:http://clickmojo.com/code/cron-tutorial.html

就服务器负载而言,除非您在非常低端的服务器上经常运行大量的数据库调用,否则它通常不会成为一个问题。我泛泛而论,但这个想法是合理的。

如果您正在使用其他东西(除了PHP)来运行您的拍卖计时器机制,我建议您附加一些代码到计时器机制,当计时器运行到零并确定获胜者时,还执行邮件发送脚本。

将PHP脚本作为命令行脚本运行。这不会对web服务器造成负载——只是对服务器造成负载,你可以很容易地通过CRON运行它。

如果将#!/usr/bin/php添加到脚本的顶部,并将chmod +x scriptname.php更改为文件的执行位,则可以直接执行脚本,而无需通过php

http://php.net/manual/en/features.commandline.php

您需要做以下几件事:

  1. 在你的拍卖信息中存储一些东西,表明你是否已经发送了这封电子邮件(可以是布尔值或发送日期,可能是空值)。不过我猜除了发这封邮件你还有别的事要做吧?比如把拍卖标为结束,这样就不能再出价了?

  2. 查找需要发送此电子邮件的拍卖的代码:例如,它们已经结束并且尚未被提醒。

  3. 重复执行2中的代码位。你可以用cron。或者,您可以为unix编写一个非常简单的守护进程,它可以在循环中持续运行(等待至少几毫秒或更长时间;做一些事情)。后者的工作量要大得多,但在我看来规模要好得多。如果您对这种方法感兴趣,请参阅http://pear.php.net/package/System_Daemon获取一些有用的工具。

要考虑的一件事是,对于意外地重复发送这封电子邮件,你要多么小心。如果你只在一个线程中运行这些代码,这很容易,但如果你想要构建到有几个不同的分布式机器来创建和发送这些电子邮件,你就得小心一点了。如果您正在用cron运行它,您能保证它的一次运行总是在另一次运行开始之前完成吗?