Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.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
在PHP中聚合数据集以获得最佳性能_Php_Multithreading_Node.js_Search - Fatal编程技术网

在PHP中聚合数据集以获得最佳性能

在PHP中聚合数据集以获得最佳性能,php,multithreading,node.js,search,Php,Multithreading,Node.js,Search,我们有一个高交易量的PHP网站,整体表现良好,但薄弱环节是搜索结果缓慢。原因是我们从许多来源收集数据。例如: 用户点击搜索>从本机数据库获取结果1>从API 2获取结果2>从API 3获取结果3>从API 4获取结果4>聚合和排序>输出到浏览器 数据来自不同的来源,一些来自我们自己的PostgreSQL数据库,但其他来自各种外部API 正如你所看到的,这种顺序存取是一个真正的杀手。我一直在研究各种使用线程的方法,以便将每个请求分配给它自己的线程,并执行最终聚合 到目前为止,我倾向于编写一个专门用

我们有一个高交易量的PHP网站,整体表现良好,但薄弱环节是搜索结果缓慢。原因是我们从许多来源收集数据。例如:

用户点击搜索>从本机数据库获取结果1>从API 2获取结果2>从API 3获取结果3>从API 4获取结果4>聚合和排序>输出到浏览器

数据来自不同的来源,一些来自我们自己的PostgreSQL数据库,但其他来自各种外部API

正如你所看到的,这种顺序存取是一个真正的杀手。我一直在研究各种使用线程的方法,以便将每个请求分配给它自己的线程,并执行最终聚合

到目前为止,我倾向于编写一个专门用于搜索的基于Java的层。我的想法是向Java服务发送一条消息,它处理tread池和聚合。我曾考虑使用node.js,但我认为可能很难实现最终结果


有人有什么想法或建议吗?我愿意使用任何语言或技术。

看起来您的请求执行时间不能小于最小API请求执行时间,即使您使所有子请求以异步模式并发运行。如果您需要将聚合函数应用于所有API和DB数据,这是正确的。但如果您不需要它,请尝试将请求分为几个小部分。您还可以尝试使用任务队列,如Gearman


<强>编辑< <强> >,您也可以在这里考虑任何类型的<强>异步< /强>调用。尝试在Gearman中为每个api调用异步启动任务,然后在主请求过程中从数据库中获取数据,并开始检查异步任务的执行结果(您可以在memcache或redis中共享它,即)。这样您就可以并行化聚合工作的一部分。

这只是一个尚未提及的替代选项

您可以坚持使用纯php,只需编写4个新进程,作为侦听本地套接字连接的守护进程运行即可。搜索脚本可以与每个守护进程建立套接字连接,并将搜索参数发送给它们,然后等待结果。您可以使用
select()
有效地等待套接字上的结果,但即使是在所有4个套接字上按顺序使用阻塞
fgets()
调用的简单解决方案,只要您在尝试从任何套接字读取结果之前将消息发送到所有4个守护进程,也会提供良好的并发性

但是,当10个不同的用户同时执行搜索时,这并不能自动提供良好的并发性。守护进程可能能够一次有效地为多个套接字连接提供服务。对于本机db查询,您的驱动程序将需要支持异步查询。这些api调用可能使用sockets/http。套接字/HTTP请求很容易通过使用<代码>选择()/<代码>进行并行化,或者可以考虑<代码> CurLyMultU/Eng> 但是…最终使用支持良好语言的线程可能会更简单。

不需要java:!!