我有一个拍卖会在不同时间结束的网站。拍卖结束后,我需要向卖家和买家发送一封自动电子邮件,通知他们拍卖结束和结果。显然,我真的不能等待有人加载页面来运行脚本,那么有没有一种好方法可以通过检查当前时间并将其与拍卖结束时间进行比较并运行该脚本来自动执行此操作?
该站点位于 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);
OTOH 如果脚本需要每分钟运行一次以上,您将需要完全不同的机制。
使用 Cron。它允许您每分钟最多运行一次任何命令:http: //clickmojo.com/code/cron-tutorial.html
就服务器负载而言,除非您在非常低端的服务器上经常运行大量数据库调用,否则它通常不会成为问题。我笼统地说,但这个想法是合理的。
如果您使用其他东西(除了 PHP)来运行您的拍卖计时器机制,我建议您将一些代码附加到该计时器机制上,当计时器运行到零并确定获胜者时,该机制还会执行邮件发送脚本。
问:在特定时间或间隔运行 PHP 脚本的最佳方式是什么?
答:使用cron
问:cronjob 会在服务器上产生很大的负载吗?
A:当然取决于你的剧本。但是检查是否应该关闭拍卖,关闭它并发送两封电子邮件应该不难。请务必创建某种锁定文件,以确保如果您的脚本运行时间超过设置的时间间隔,它不会运行两次。
问:运行间隔小于 1 分钟的脚本
答:无法为您回答这个问题。对不起 :)
将 PHP 脚本作为命令行脚本运行。这不会给网络服务器带来负担——只是给服务器带来负担,您可以通过 CRON 轻松运行它。
如果您添加#!/usr/bin/php
到脚本的顶部并更改文件上的执行位,chmod +x scriptname.php
您可以直接执行脚本而无需通过php传递
你需要做几件事:
在您的拍卖信息中存储一些内容,表明您是否已发送此电子邮件(可以是布尔值或发送日期,可能为空)。尽管我不得不假设您除了发送这封电子邮件之外还需要做一些事情吗?喜欢将拍卖标记为已结束,这样就不能再进行竞标了吗?
查找需要发送此电子邮件的拍卖的一些代码:例如,它们已经结束并且还没有被提醒。
重复执行 2 中的代码的东西。你可以使用 cron。或者,您可以为 unix 编写一个非常简单的守护程序,该守护程序在循环中不断运行(等待至少几毫秒或更长时间;做一些事情)。后者的工作量更大,但在我看来,规模要好得多。如果您对这种方法感兴趣,请参阅http://pear.php.net/package/System_Daemon以获取一些有用的工具。
需要考虑的一件事是,您要小心避免意外重复发送这封电子邮件。如果您只在单个线程中运行此代码,这很容易,但如果您想要构建到拥有多个不同的分布式机器来创建和发送这些电子邮件的地步,您必须更加小心。如果你用 cron 运行它,你能保证它的一次运行总是在另一次开始之前完成吗?