2015-07-19 56 views
3

我从某些Web服务获取信息,但我希望我调用的方法只是异步的,因为请求时间太长,以致网站加载速度变慢。PHP中的异步网络服务

我目前使用正常的SOAP调用

$client = new SoapClient("http://xxxx.com/webservices/json.asmx?WSDL"); 

$result = $client->__soapCall($id, $parameters); 

有人可以帮我请

+0

即使您实现了来自PHP的异步调用,您仍然需要等待X个时间,直到结果返回到PHP脚本。你的网站仍然会挂起,你什么也没有取得。在您的应用程序(客户端)中实施加载指示器,并且不要对缓慢的服务执行太多的SOAP请求。 – Mjh

回答

1

这种正常的做法是不是只在服务器端异步的策略,因为这不符合php的工作原理,而是应用这种策略:

您处理请求并将HTML页面响应给客户端,该客户端具有缓慢API调用结果的容器元素,但容器留空或者包含一个占位符,另外一个客户端逻辑被提供,所以javascript,它向客户端的文档就绪事件注册一个处理程序,在这个处理程序中,它发出一个jax请求回到服务器,通常每个API调用都需要执行一个请求。在ajax请求中收到的有效负载用于使用最终数据填充html内的容器。

通过这种方式,页面/视图本身的生成和呈现与完全等待API调用分离。此外,策略是透明的,用户可以看到额外的数据被提取出来,这使得等待期从心理学的角度来看更加可以接受。

您可以想到该策略的一种变体,它已经注册了基于服务器的作业,执行实际的API调用并缓存结果。这样你就可以保持发送页面的双向延迟,并等待ajax调用进来。然而,这里面临的挑战是保持这些作业与原始请求之间的连接,其后续的ajax调用不是一个简单的任务。通常,这种优势根本无法证明额外的努力。

所以作为底线可以说,通常在纯php中没有异步策略被实现。相反,原始请求被分成几个独立的请求。只有第一个请求被立即处理和响应,独立于任何缓慢的API调用。然后,并行地,ajax请求触发API调用并将结果信息添加到对第一个请求的响应中。

0

异步 - 它不是关于PHP。 脚本按原样工作,一行一行,我们无能为力。 如果你想快速完成任务(更接近异步),你应该重新构建你的应用程序架构。

https://en.wikipedia.org/wiki/Service-oriented_architecture

首先,你应该有一些“公交车”事件,一个脚本放在那里的一些命令,其他脚本(恶魔)侦听并执行该命令。

这里的利润是,将公共汽车的某些命令更快(我们甚至不需要等待响应)然后做实际的工作。实际工作($客户端=新SoapClient的(...)这里应该由其他脚本来完成。

对不起英语

0

这也取决于你是否需要网络服务的输出。

如果您需要它,请使用Ajax方式或服务方式。您也可以使用队列来管理作业,如Redis或beanstalkd。

如果你不需要输出,只是想调用API,那么你也可以把这些代码在另一个脚本,并调用它的背景下,像

shell_exec('php script.php someargs >/dev/null 2>&1 &'); 

通知的重定向,他们是需要的。