如何解决在PHP后端没有同时执行的ajax调用问题?

时间:2015-03-24 17:52:43

标签: php ajax angularjs asynchronous soap

我正在开发一个需要使用SOAP从Web服务调用函数的Web应用程序。

我编写了一个简单的PHP后端来访问SOAP函数。后端主要由具有静态"帮助"的类组成。方法(我只在需要时使用__autoload()来加载类。)

在应用程序的某个时刻,我需要同时调用两个SOAP函数。由于我想加快这个过程,我会同时使用两个ajax调用。

事实是,这些电话并不总是同时运行。请求是同时发送的,但第二次呼叫持续的时间比第一次要长(它们应该具有大致相同的运行时间)。如果第一个呼叫持续600毫秒,则第二个呼叫持续1400-1600毫秒。

我已经设置了一个简单的测试,我首先并行调用这两个函数,然后,当两个请求完成时,一个接一个地串行调用。

Request test with second call lasting longer

我尝试过分析PHP端(使用microtime()和xdebug),但我一直发现调用在PHP上的执行时间相同(约500ms)。

然而,真正令我疯狂的是,同样的代码似乎以明显随机的方式工作和打破。有时我会重新加载页面并同时执行调用。然后我再次重新加载,第二次呼叫需要更长时间。

Request test with expected results

PHP会话锁定应该不是问题,我只在需要时打开会话,然后用session_write_close()关闭它。

php后端调用的SOAP服务器支持多个连接,除了我的microtime()分析表明我完成SOAP请求需要大约400ms,所以我不认为Web服务应该归咎于

在客户端,请求同时发送。我尝试在第二次通话中添加一点延迟,但没有用。

但话又说回来,"随机"行为让我感到困惑。 我已经在本地(WAMP)和两个不同的服务器(共享主机)上测试了应用程序。在所有环境中,都使用了PHP 5.5。

可能导致这种差异的原因是什么,如果行为不是100%一致,怎么可能试图找出问题呢?

1 个答案:

答案 0 :(得分:0)

我已经解开了这个谜团。

在我的本地环境中,一旦我禁用xdebug,ajax调用就会并行运行完美。

在遥控器中,我仍然遇到了同样的问题(根本没有xdebug)。 首先,我尝试使用一个单独的AJAX调用PHP脚本,该脚本使用curl_multi_exec()并行运行SOAP请求,基本上是类似的设置,但主要是服务器端。

我发现使用这种技术的时间也有相同的差异,模式非常相似。

我已联系托管服务提供商解释我的问题,他们告诉我,这可能是由于共享环境资源有限,具体取决于整体负载。

所以最终虽然可以实现这种行为,但在我的具体情况下,我不得不改变策略并使用两个串行AJAX调用,在第一次调用后更新视图,以便在等待时给出更快响应的印象第二次要求完成。