运行预定作业

时间:2011-02-06 05:20:23

标签: php cron scheduled-tasks

我想在用户提交表单后正好调用一个函数30分钟。我正在使用javascript setTimeOut()函数,但在页面刷新或浏览器关闭时清除了计时器。无论什么(浏览器是关闭还是刷新),我都希望在30分钟后完全调用该功能。我还希望将剩余时间显示为30分钟以及。

我查看了Cron的工作,但我的理解是PHP无法直接调用cron作业。

谁能告诉我这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

  1. at command和关联的atd守护程序可以安排将来在任意时间执行的事情。你可能不得不写一个专门的PHP脚本来传递给at。您可以向其传递额外的参数,以便知道哪个用户提交了表单等。当然,这些代码将在服务器上执行。 PHP代码会将结果存储在数据库(或类似的全局数据存储)中。
  2. 要显示留给用户的时间,我会将时间存储在会话或数据库中。请记住,服务器时间将与用户计算机上的时间不同,因此最好在服务器上进行任何差异计算,而不是使用JavaScript。
  3. 仍然可以使用setTimeout()调用来确保将浏览器重定向到某个页面(或通过AJAX加载它等)以在适当的时间查看结果(假设用户在您的网站上时事件发生)。根据会话中的时间,将每个页面上的setTimeout()加载到正确的时间。
  4. 请记住,步骤#1中的PHP代码需要一段时间才能执行,因此您可能需要向#3添加一个小延迟以确保结果可用,以及适当的错误处理结果因其他原因无法使用。

答案 1 :(得分:2)

我投票赞成@wuputah方法并同意这是最好的,但是如果你无法访问他的第1步(在共享主机上等),那么你可以在数据库中设置时间戳并设置一个cron作业运行每1分钟检查数据库“过期”时间而没有“已处理”标志...然后对该数据执行程序(并将数据库条目标记为“已处理”,以便在下一次执行时不执行周期)。

+---------------------------------------------+
| RECORD ID | TIMESTAMP           | PROCESSED |
+---------------------------------------------+
|   1       | 2010-02-06 15:27:10 | yes       |
|   2       | 2010-02-06 15:47:10 | no        |
|   3       | 2010-02-06 15:49:10 | no        |
+---------------------------------------------+