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

时间:2013-02-28 01:50:54

标签: php unix cron

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

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

5 个答案:

答案 0 :(得分:2)

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

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

如果您的脚本花费的时间超过一分钟(您应该对此进行监控),只需:

  • 延长两次运行之间的间隔时间,或
  • 使用lock file确保脚本的两个实例不能同时运行。

    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);
    

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

答案 1 :(得分:1)

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

就服务器负载而言,除非您经常在非常低端的服务器上运行大量数据库调用,否则通常不会引起关注。我讲的是一般性,但这个想法很合理。

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

答案 2 :(得分:1)

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

问:cronjob会在服务器上造成很大的负担吗? 答:取决于您的脚本。但是,检查拍卖是否应该关闭,关闭它并发送两封电子邮件应该不难。一定要创建某种锁文件,以确保如果你的脚本运行的时间超过设置的时间间隔,它就不会运行两次。

问:运行时间间隔短于1分钟的脚本
答:不能为你回答这个问题。对不起:)

答案 3 :(得分:0)

将PHP脚本作为命令行脚本运行。这不会给网络服务器带来负担 - 只是服务器上的负载,你可以通过CRON轻松运行它。

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

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

答案 4 :(得分:0)

您需要执行以下几项操作:

  1. 在您的竞价信息中存储一些信息,表明您是否已发送此电子邮件(可能是布尔值或发送时间可能为空的日期)。虽然我不得不假设除了发送这封电子邮件之外你还需要做些什么?比如将拍卖标记为已关闭,以便不再进行投标?

  2. 发现需要发送电子邮件的拍卖的一些代码:例如他们已经结束并且还没有被提醒。

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

  4. 要考虑的一件事是你要小心不小心重复发送这封电子邮件。如果你只是在一个线程中运行这个代码,这很容易,但如果你想要构建到几个不同的分布式机器来创建和发送这些电子邮件,你必须要小心一些。如果你从cron中运行它,你可以保证一次运行它会在另一个启动之前完成吗?