3

我正在开发一个消费者网络应用程序,该应用程序需要执行与每个客户请求相关的长时间运行的后台进程。长跑是指1到3分钟之间的任何地方。

这是一个示例流程。对象/小部件并不重要。

  1. 客户来到站点并指定他们正在寻找的对象/小部件。
  2. 我们搜索/清理/过滤匹配某些初始条件的小部件。<-- 长时间运行的进程
  3. 客户进一步配置有关他们正在寻找的小部件的更多详细信息。
  4. 当长期运行的过程完成后,客户可以完成转换前的最后几个步骤。

第 3 步和第 4 步并不重要。我之所以提到它们,是因为我们可以在进行长期运行的过程中争取一些时间。

我们工作的环境是一个 LAMP 堆栈——目前使用的是 PHP。让长时间运行的进程占用 mod_php(或 fastcgi 进程)中的 apache 线程似乎不是一个好的设计。我们应用程序的 apache 层应该专注于提供内容而不是数据处理 IMO。

几个问题:

  1. 我们的想法是否正确,我们应该将这个“长期运行”的部分从 apache/web 应用程序层中分离出来?
  2. 在 Linux/Apache/MySQL/PHP 下是否有标准/典型的方法来解决这个问题(如果合适,我们愿意使用不同的语言进行处理)?
  3. 关于如何打破它的任何建议?例如,我们是否创建了一个通过 FIFO 队列搅动的守护进程?

编辑:澄清一下,只有大约 1/4 的长期运行过程是以数据库为中心的。我们正在努力优化这部分。我们可能会做一些工作,但我们现在能做的事情是有限的。

谢谢!

4

6 回答 6

1

正如 Jonnii 所建议的,您可以启动一个子进程来进行后台处理。但是,这需要小心谨慎:

  • 确保通过的任何参数都正确转义
  • 确保不会同时运行多个进程副本

如果该过程的多个副本运行,则没有什么可以阻止(甚至不是恶意的,只是不耐烦的)用户在启动它的页面上点击重新加载,最终启动如此多的副本以致机器耗尽内存并停止运行。

因此,您可以使用子流程,但要小心,以受控的方式进行操作,并正确测试它。

另一种选择是让守护程序永久运行以等待请求,该守护程序处理它们,然后将结果记录在某处(可能在数据库中)

于 2008-10-26T06:12:11.040 回答
1

考虑通过 AJAX 从 Web 服务而不是您的应用程序提供搜索结果。大概您可以将其卸载到另一台服务器,并让您的 Web 应用程序根据需要处理内容。

只是好奇:1-3 分钟对于查找查询来说似乎很长。您是否查看了要查询的列上的索引以提高速度?或者你需要做一些算法过程——也许你可以离线执行一些,并预先填充一些带有提示的常见搜索?

于 2008-10-24T21:44:53.150 回答
0

这里有一些关于这个问题的Java版本的讨论。

请参阅java:与批处理服务器通信的最佳技术是什么

您可能会做两件重要的事情:

  1. 切换到 Java 并使用 JMS。

  2. 阅读 JMS 但使用另一个队列管理器。例如,Unix 命名管道可能是一个可接受的实现。

于 2008-10-24T23:32:44.773 回答
0

Java servlet 可以进行后台处理。您可以在具有线程支持的 Web 技术中执行类似于此技术的操作。我不知道PHP虽然。

于 2008-10-24T23:50:34.973 回答
0

这是穷人的解决方案:

exec ("/usr/bin/php long_running_process.php > /dev/null &");

或者,您可以:

  1. 在您的数据库中插入一行,其中包含后台请求的详细信息,然后守护程序可以读取和处理该行。

  2. 将消息写入消息队列,然后由守护进程读取并处理。

于 2008-10-24T21:44:14.260 回答
-1

不是一个完整的答案,但我认为使用 AJAX 并将第二步传递给比 PHP(C、C++、C#)更快的东西,然后一个 PHP 函数从一些堆栈中挑选结果,很可能只是一个数据库。

于 2008-10-24T21:44:59.000 回答