执行长动作

时间:2013-06-25 17:28:07

标签: php

我正在创建一个PHP脚本,允许用户登录网站并执行数据库查询,并执行可能需要一些时间才能完成的其他操作。如果PHP脚本运行这些操作并且它们花费的时间太长,则浏览器页面会在用户端超时,并且操作永远不会在服务器端完成。如果我将用户重定向到另一个页面,然后尝试在PHP脚本中运行该操作,即使用户不在页面上,服务器也会运行它吗?行动还有时间吗?

4 个答案:

答案 0 :(得分:3)

如果在这样的Web应用程序中长时间运行服务器端操作,一个好的方法是将操作的排队(应由Web应用程序处理)与运行操作(应由不同的服务器端应用程序处理)。

在这种情况下,它可以像Web应用程序一样简单地将记录插入到数据库表中,该数据库表指示用户X已经请求在时间Z处理Action Y.后端进程(始终运行的守护进程,已安排脚本,无论你喜欢什么)将不断轮询该数据库表以查找新条目。 (“New”可能表示为该表中的“IsComplete”列。)它可以每分钟,每隔几分钟,每小时轮询一次......无论服务器性能与动作开始的响应性之间的平衡如何当它被要求时。

操作完成后,运行操作的服务器端应用程序会在数据库中将其标记为已完成,并将结果存储在您需要存储的任何位置。 (另一个数据库表或一组表?一个文件?等等)Web应用程序可以在需要时检查这些结果(例如在每个页面加载时,可能存在排队操作的某种“当前状态”)在每个页面上,以便用户可以看到它何时准备好。

所有这一切的原因只是让面向用户的Web应用程序保持响应。即使您执行增加超时等操作,用户的浏览器仍可能会放弃。或者用户自己可能会在盯着空白页面和旋转光标太长时间后放弃。用户界面应始终快速响应用户。

答案 1 :(得分:1)

您可以使用类似ignore_user_abort的内容,但在我看来这仍然不理想。我会考虑推迟这些操作并通过消息队列运行它们。 PHP附带Gearman - 这是一个选项。使用消息队列可以很好地扩展,并且可以更好地确保请求操作实际完成。

关于这个问题很多...... Asynchronous processing or message queues in PHP (CakePHP) ......但是不要使用Cake:)

答案 2 :(得分:0)

set_time_limit()是你的朋友。

答案 3 :(得分:0)

如果是我,我会在用户界面中加载一个加载图标动画,告诉他们等待。然后我将使用异步AJAX调用执行“漫长过程”,然后返回一个肯定或否定的答案,通过JavaScript传递给用户。

就像上传图片到Facebook一样,您可以告诉用户发生了什么。很干净!