2011-02-06 67 views
0

我想在用户提交表单后30分钟内调用一个函数。我正在使用javascript setTimeOut()函数,但清除页面刷新或浏览器关闭时的计时器。无论浏览器是关闭还是刷新,我都想在30分钟后精确调用该函数。&我也想显示剩余时间到30分钟以及。运行预定作业

我看着Cron作业,但我的理解是,PHP不能直接调用cron作业。

谁能告诉我这将是做到这一点的最好办法?

+0

这取决于具体情况。它是否需要在浏览器或服务器上运行?它需要多少准确度,±1分钟是否可以接受? – deceze 2011-02-06 05:23:14

+0

±1是可以接受的。我想保持它在后端运行,也许在服务器上运行。我的要求是,一旦提交表格,计划中不应该有任何停顿。它运行的地方(浏览器或服务器)只要继续运行就没关系 – ptamzz 2011-02-06 05:39:14

回答

6
  1. at command和相关的atd守护进程可以安排将来在任意时间执行的事情。你可能不得不写一个专门的PHP脚本传递给at。您可以将额外的参数传递给它以便知道哪个用户提交了表单等。当然,这些代码将在服务器上执行。 PHP代码会将结果存储在数据库(或类似的全局数据存储)中。
  2. 要显示留给用户多少时间,我会将时间存储在会话或数据库中。请记住,服务器时间与用户计算机上的时间不同,因此最好在服务器上执行任何差异计算,而不是在JavaScript中执行。
  3. setTimeout()呼叫仍然可以使用,以保证浏览器被重定向到一个页面(或通过AJAX等加载它)来查看在适当的时间的结果(假定用户是网站上的事件发生时)。继续根据会话中的时间,将每页上的setTimeout()加载到正确的时间。

请记住,步骤#1中的PHP代码需要时间来执行,因此您可能需要向#3添加一个小延迟以确保结果可用,以及相应的错误由于其他原因,处理结果不可用。

+0

+1我会用这个方法去 – 2011-02-06 05:37:06

2

我投了@wuputah方法,并同意它是最好的,但如果你无法访问他的第一步(共享主机等),那么你可以设置时间戳在数据库中,并设置一个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  | 
+---------------------------------------------+