1

任何用户都可以根据需要多次触发事件。每次触发此事件时,都会在 mysql 表中创建一行,其中包含时间戳、用户 ID 和其他有用信息。我需要做的是启动一个脚本,该脚本在事件触发后恰好运行 12 小时,即针对表中的每一行。

我怎样才能以自动化和高效的方式实现这一目标?

4

5 回答 5

3

您可以使用每分钟启动脚本的 cron 作业。

在脚本中,您应该首先获取行并检查是否可以运行(如果 12 小时过去了)然后继续,否则停止。

我不知道这是否会非常有效,这取决于您在数据库中的条目数,但从技术上讲,仅检查当前日期是否与从数据库中获取的日期相匹配 + 12 小时并不昂贵,我不能说更多因为您没有提供有关数据的太多详细信息。

于 2013-01-14T16:43:26.883 回答
1

使用 cronjob 可能会更好

http://en.wikipedia.org/wiki/Cron

潜在地,您可以查看 MySQL 事件调度程序。虽然它可能不适合您的需求,但很难真正说出给出的细节

http://dev.mysql.com/doc/refman/5.1/en/events.html

就像是

CREATE EVENT myTimedEvent ON SCHEDULE EVERY INTERVAL 5 minutes DO CALL updateRows();

updateRows 检查您的标准(12 小时前),如果是,请执行您想要执行的任何操作。这要求您的 MySQL 为@ 5.1+ 版本

于 2013-01-14T16:48:50.707 回答
0

对我来说最简单的方法是让页头包含

<head>
    <meta http-equiv="refresh" content="43200"> <!-- 43200 for (12 hours × 60 mintes × 60 seconds)  -->
</head> 

这种方法对于避免服务器超时非常有帮助,如果您只使用 PHP 代码,您将无法避免这种情况

重要的是,如果您使用提交按钮启动脚本,建议您将表单action="other_page"设置为不同的页面,并确保您应该使用setcookie函数将输入值保存为 cookie,并在操作页面中使用$cookieVar = $_COOKIE['the_cookie_name'] ;

您可能需要增加或减少 $cookieVar 值并在每次您的头部代码http-equiv在特定秒数(在我们的示例中为 43200)后自动刷新时使用 setcookie 再次更新该值,具体取决于您要执行的操作

请注意,如果您在不按提交按钮的情况下自动启动操作,您可以在同一页面中执行操作。

我之前做过这个想法,我在一个文件夹中有 180,000 张图片,但服务器不允许我全部下载,因为它只显示前 7998 张图片,所以我创建了一个脚本,将每 1000 张图片压缩到一个文件之外的文件中images 文件夹,为了避免超时,我让代码每 60 秒刷新一次,最后我只有 180 个 zip 文件:)

于 2013-10-12T17:49:04.130 回答
0

您可能最好有一个每分钟运行一次的 cron 作业,并检查数据库中是否存在 > 12 小时前尚未处理脚本并处理它们的任何行。这不会给您带来 12 小时的差异,但会在一分钟内给您带来差异。

您可能还希望确保该脚本能够在几秒钟内运行,这样您就不会重叠同时运行两次的脚本。

于 2013-01-14T16:45:14.023 回答
0

这可以使用 CronJobs 来完成。如果您对您的服务器或提供 cronjob 管理的服务器管理工​​具包具有 root 访问权限,您将在您的服务器上执行此操作。否则使用在线 cronjob 服务(google for cronjob online)。

然后,cronjob 会在您定义的时间间隔(例如每分钟或每 5 分钟)在您的服务器上触发一个 php 脚本。

然后,此脚本从您的 mysql 表中选择所有早于 12 小时 ( WHERE timestamp <= NOW() - INTERVAL 12 hour) 的行,并对每个结果执行所需的操作并从表中删除结果(或将其标记为完成),

只需确保获取和操作本​​身比您的 cronjob 间隔更快,否则您将有两个或多个脚本在同一行上工作。

于 2013-01-14T16:47:44.683 回答