Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 寻找处理与web应用程序相关的长期运行操作的模式/方法/建议_Performance_Apache_Architecture_Web Applications_Lamp - Fatal编程技术网

Performance 寻找处理与web应用程序相关的长期运行操作的模式/方法/建议

Performance 寻找处理与web应用程序相关的长期运行操作的模式/方法/建议,performance,apache,architecture,web-applications,lamp,Performance,Apache,Architecture,Web Applications,Lamp,我正在开发一个消费者web应用程序,它需要执行一个与每个客户请求相关的长时间运行的后台流程。所谓长跑,我指的是1到3分钟之间的任何地方 下面是一个示例流。对象/小部件实际上并不重要 客户来到站点并指定他们要查找的对象/小部件 我们搜索/清理/过滤符合某些初始条件的小部件 这是穷人的解决方案: exec ("/usr/bin/php long_running_process.php > /dev/null &"); 或者,您可以: 在数据库中插入一行,其中包含后台请求的详细信息,然

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

下面是一个示例流。对象/小部件实际上并不重要

  • 客户来到站点并指定他们要查找的对象/小部件

  • 我们搜索/清理/过滤符合某些初始条件的小部件 这是穷人的解决方案:

    exec ("/usr/bin/php long_running_process.php > /dev/null &");
    
    或者,您可以:

  • 在数据库中插入一行,其中包含后台请求的详细信息,然后守护进程可以读取并处理该请求

  • 将消息写入消息队列,然后守护进程读取并处理该消息队列


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


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

    < p>不是一个完整的答案,但是我会想用Ajax,把第二步传递给PHP(C,C++,C)快一点的东西。然后一个PHP函数从一些堆栈中挑选结果,很可能只是一个数据库。

    下面是关于这个问题的Java版本的一些讨论

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

  • 切换到Java并使用JMS

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


  • Java servlet可以做到这一点。您可以在具有线程支持的web技术中执行类似于此技术的操作。不过我不知道PHP。

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

    • 确保正确转义通过的所有参数
    • 确保进程的多个副本不会同时运行
    如果进程的多个副本运行,没有任何东西可以阻止(甚至不是恶意的,只是不耐烦的)用户在页面上点击重新加载,从而启动进程,最终启动如此多的副本,导致机器耗尽ram并停止运行

    因此,您可以使用子流程,但要以可控的方式小心地执行,并正确地测试它


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

    您好,我们已经对模式进行了多次遍历,以确保它被正确索引。我们的局限性在于无法进行太多离线处理(数据使用协议的b/c)。Apache ActiveMQ支持多种语言和协议,包括PHP到Stomp:。