我正在开发一个消费者网络应用程序,该应用程序需要执行与每个客户请求相关的长时间运行后台进程。通过长时间运行,我的意思是1到3分钟之间。
这是一个示例流程。对象/小部件并不重要。
步骤3和4并不重要。我只是提到它们,因为我们可以在长时间运行的过程中花一些时间。
我们正在使用的环境是LAMP堆栈 - 目前正在使用PHP。在mod_php(或fastcgi进程)中使长时间运行的进程占用apache线程似乎不是一个好的设计。我们的应用的apache层应该专注于提供内容而不是数据处理IMO。
几个问题:
编辑:只是为了澄清,只有大约1/4的长时间运行过程是以数据库为中心的。我们正在努力优化该部分。我们可能会做一些工作,但我们现在可以做的数量有限。
谢谢!
答案 0 :(得分:1)
考虑通过AJAX从Web服务而不是您的应用程序提供搜索结果。据推测,您可以将其卸载到另一台服务器,让Web应用程序根据需要处理内容。
好奇:1-3分钟对于查询查询似乎很长时间。您是否查看了要查询的列上的索引以提高速度?或者你需要做一些算法过程 - 也许你可以离线执行一些这样的过程,并用提示预先填充一些常见的搜索?
答案 1 :(得分:1)
正如Jonnii建议的那样,您可以启动子进程来执行后台处理。但是,这需要谨慎处理:
如果进程的多个副本运行,那么就没有什么能阻止(甚至是恶意的,只是不耐烦的)用户在页面上重新加载它,最终启动了这么多副本,机器用完ram并研磨到停了下来。
因此,您可以使用子流程,但要以受控方式仔细地进行,并对其进行正确测试。
另一个选择是让守护进程永久运行等待请求,处理它们然后将结果记录到某个地方(可能在数据库中)
答案 2 :(得分:0)
这是穷人的解决方案:
exec ("/usr/bin/php long_running_process.php > /dev/null &");
或者你可以:
在数据库中插入一行,其中包含后台请求的详细信息,然后守护程序可以读取并处理。
将消息写入消息队列,然后读取并处理守护程序。
答案 3 :(得分:0)
以下是对此问题的Java版本的一些讨论。
请参阅java: what are the best techniques for communicating with a batch server
您可能会做的两件重要事情:
切换到Java并使用JMS。
阅读JMS但使用其他队列管理器。例如,Unix命名管道可能是可接受的实现。
答案 4 :(得分:0)
Java servlet可以background processing。您可以在具有线程支持的Web技术中执行与此技术类似的操作。我不知道PHP。
答案 5 :(得分:-1)
不是一个完整的答案,但我认为使用AJAX并将第二步传递给比PHP(C,C ++,C#)更快的东西,然后PHP函数从一些堆栈中选择结果,很可能只是一个数据库。