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

在特定时间运行PHP脚本的最佳方式是什么?,php,unix,cron,Php,Unix,Cron,我有一个网站,拍卖结束的时间不同。我需要在拍卖结束后向卖家和买家发送一封自动电子邮件,通知他们拍卖结束和结果。显然,我真的等不及有人加载页面来运行脚本了,那么有没有一种好方法可以通过检查当前时间并将其与拍卖结束的时间进行比较并运行脚本来实现自动化 该站点位于UNIX服务器上,因此可以选择cron作业,但我担心运行这样的cron作业会给服务器带来相当大的负载。cron作业最多每分钟运行一次 它在服务器上生成的负载实际上取决于要运行的脚本类型。顺便说一句,我假设您正在使用cli运行脚本(而不仅仅是执

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


该站点位于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);
    

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

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

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

使用Cron。它允许您每分钟最多运行一次命令:

就服务器负载而言,除非您经常在非常低端的服务器上运行大量的数据库调用,否则通常不会引起关注


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

使用Cron。它允许您每分钟最多运行一次命令:

就服务器负载而言,除非您经常在非常低端的服务器上运行大量的数据库调用,否则通常不会引起关注


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

将PHP脚本作为命令行脚本运行。这不会在Web服务器上加载—只是在服务器上加载,您可以通过CRON轻松运行它

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


将PHP脚本作为命令行脚本运行。这不会在Web服务器上加载—只是在服务器上加载,您可以通过CRON轻松运行它

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


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

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

Q:以短于1分钟的时间间隔运行脚本

答:无法为您回答此问题。抱歉:)

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

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

Q:以短于1分钟的时间间隔运行脚本

答:无法为您回答此问题。抱歉:)

您需要做以下几件事:

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

  • 查找需要发送此电子邮件的拍卖的一些代码:例如,拍卖已结束,尚未提醒

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

  • 有一件事要考虑的是,如果你不小心发送了这封邮件,你会多么小心。如果你只在一个线程中运行这段代码,这是非常容易的,但是如果你想构建出一个拥有多个不同的分布式系统的点