如何同时实现多个Web服务?使用PHP

5
我正在从事一项能源项目。在我的网站上,有许多能源服务通过Web服务注册其入学过程。最初只有一个,现在又增加了三个。
在第一页上,我必须根据邮政编码显示计划。现在,在此页面上,我必须请求所有四个能源提供商列出能源计划。
按顺序逐个请求每个服务肯定需要更长的时间,因为我必须从外部源获取数据,而且这是第一页,所以我不想在第一次实例中就使它变慢。
如何同时向所有服务发出请求,并从每个服务收集数据并在最终页面上列出它们?

我知道很多人会抱怨,但你有没有考虑过多线程?从前几个谷歌搜索结果来看,这些看起来是不错的起点... http://villavu.com/forum/showthread.php?t=73623 和 http://blog.motane.lu/2009/01/02/multithreading-in-php/ 支持似乎很少,但这可能通过同时进行所有4个请求来加速事情的处理——至少我是这么想的... - blad
1
缓存方面怎么样?这些计划有多频繁更改?必须是实时的吗?为什么不设置一个cron job,每1-5分钟轮询所有服务并将结果存储在memcache或MySQL HEAP表中?然后您的前端可以从缓存中读取而不是从Web服务中读取。 - Costa
@Costa听起来是个不错的解决方案。但问题是,我甚至不知道有多少个邮政编码,以及他们计划更改的频率。可能会有大约50K个邮政编码。但我会记住这个建议,在可行的情况下实施。 - Vins
1个回答

3
在Web服务器上执行时,使用PHP确实只有一种非恶心的方法来做到这一点。您需要在PHP中编译cURL模块。它内置支持执行并行请求。请查看www.php.net上的评论和文档以获取用法示例。
尝试:http://www.php.net/manual/en/function.curl-multi-init.php 其他选择,如分叉后台进程或调用UNIX shell,维护起来很麻烦,而且很少跨平台。在几乎所有常见的PHP环境中,多线程都不是一个有效的选择。
我应该提到,虽然不一定建议,但可以使用AJAX方法。在某些情况下,它不太轻巧,但应该进行权衡。

在处理类似情况时,我通过将工作卸载到一个Cake Shell中来解决问题,该shell使用pcntl_fork运行并发的webservice请求。子进程将响应存储在共享内存中,当所有进程都完成时,父shell进程收集它们并发送回web请求。对我来说,这可以大幅减少加载时间。但是请考虑Pestilence关于此解决方案的观点。 - Ceeram
@pestilence 如果我使用不同的请求来调用Web服务,例如一个使用REST,第二个使用SOAP,第三个使用Curl。那么这个时候它会有什么帮助呢? - Javascript Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接