如何解决 ajax 调用未在 PHP 后端同时执行的问题?
How to troubleshoot ajax calls not being executed simultaneously in PHP backend?
我正在开发需要使用 SOAP 从 Web 服务调用函数的 Web 应用程序。
我编写了一个简单的 PHP 后端来访问 SOAP 函数。后端主要由 类 和静态 "helper" 方法组成(我使用 __autoload() 仅在需要时加载 类)。
在应用程序的某个时刻,我需要同时调用两个 SOAP 函数。因为我想加快这个过程,所以我同时使用了两个 ajax 调用。
问题是,这些呼叫并不总是 运行 同时进行。请求是同时发送的,但是第二次调用比第一次调用持续时间更长(它们应该具有大致相同的 运行 时间)。如果第一次调用持续 600 毫秒,则第二次调用持续 1400-1600 毫秒。
我设置了一个简单的测试,我先并行调用两个函数,然后在两个请求完成后,一个接一个地串行调用。
我已经尝试分析 PHP 端(都使用 microtime() 和 xdebug),但我一直发现这些调用在 PHP 上具有相同的执行时间(大约 500 毫秒) .
但真正让我发疯的是,同样的代码似乎以一种明显随机的方式工作和中断。有时我重新加载页面并且调用同时执行。然后我再次重新加载,第二次调用需要更长的时间,再一次。
PHP 会话锁定应该不是问题,我只在需要时打开会话,然后用 session_write_close() 关闭它。
php 后端调用的 SOAP 服务器支持多个连接,而且我的 microtime() 分析表明完成一个 SOAP 请求大约需要 400 毫秒,所以我不认为 web服务是罪魁祸首。
在客户端,请求是同时发送的。我尝试在第二次调用中添加轻微延迟,但无济于事。
但话又说回来,这种 "random" 行为让我感到困惑。
我已经在本地 (WAMP) 和两个不同的服务器(共享主机)上测试了该应用程序。在所有环境中,都使用了 PHP 5.5。
可能是什么导致了这种差异,如果行为不是 100% 一致,如何尝试隔离问题?
我解开了谜底
在我的本地环境中,一旦我禁用了 xdebug,ajax 就会完美地并行调用 运行。
在远程,我仍然遇到同样的问题(而且根本没有 xdebug)。
所以首先,我尝试使用一个 AJAX 调用 PHP 脚本,该脚本使用 curl_multi_exec() 到 运行 并行的 SOAP 请求,基本上是类似的设置但主要是服务器端。
我发现我在使用这种技术时也有同样的时间差异,而且模式非常相似。
我已联系托管服务提供商解释我的问题,他们告诉我这可能是由于共享环境的资源有限,具体取决于整体负载。
所以最后虽然有可能实现这种行为,但在我的具体情况下,我不得不改变我的策略并使用两个串行 AJAX 调用,在第一次调用后更新视图以给人的印象在等待第二次调用完成时响应更快。
我正在开发需要使用 SOAP 从 Web 服务调用函数的 Web 应用程序。
我编写了一个简单的 PHP 后端来访问 SOAP 函数。后端主要由 类 和静态 "helper" 方法组成(我使用 __autoload() 仅在需要时加载 类)。
在应用程序的某个时刻,我需要同时调用两个 SOAP 函数。因为我想加快这个过程,所以我同时使用了两个 ajax 调用。
问题是,这些呼叫并不总是 运行 同时进行。请求是同时发送的,但是第二次调用比第一次调用持续时间更长(它们应该具有大致相同的 运行 时间)。如果第一次调用持续 600 毫秒,则第二次调用持续 1400-1600 毫秒。
我设置了一个简单的测试,我先并行调用两个函数,然后在两个请求完成后,一个接一个地串行调用。
我已经尝试分析 PHP 端(都使用 microtime() 和 xdebug),但我一直发现这些调用在 PHP 上具有相同的执行时间(大约 500 毫秒) .
但真正让我发疯的是,同样的代码似乎以一种明显随机的方式工作和中断。有时我重新加载页面并且调用同时执行。然后我再次重新加载,第二次调用需要更长的时间,再一次。
PHP 会话锁定应该不是问题,我只在需要时打开会话,然后用 session_write_close() 关闭它。
php 后端调用的 SOAP 服务器支持多个连接,而且我的 microtime() 分析表明完成一个 SOAP 请求大约需要 400 毫秒,所以我不认为 web服务是罪魁祸首。
在客户端,请求是同时发送的。我尝试在第二次调用中添加轻微延迟,但无济于事。
但话又说回来,这种 "random" 行为让我感到困惑。 我已经在本地 (WAMP) 和两个不同的服务器(共享主机)上测试了该应用程序。在所有环境中,都使用了 PHP 5.5。
可能是什么导致了这种差异,如果行为不是 100% 一致,如何尝试隔离问题?
我解开了谜底
在我的本地环境中,一旦我禁用了 xdebug,ajax 就会完美地并行调用 运行。
在远程,我仍然遇到同样的问题(而且根本没有 xdebug)。 所以首先,我尝试使用一个 AJAX 调用 PHP 脚本,该脚本使用 curl_multi_exec() 到 运行 并行的 SOAP 请求,基本上是类似的设置但主要是服务器端。
我发现我在使用这种技术时也有同样的时间差异,而且模式非常相似。
我已联系托管服务提供商解释我的问题,他们告诉我这可能是由于共享环境的资源有限,具体取决于整体负载。
所以最后虽然有可能实现这种行为,但在我的具体情况下,我不得不改变我的策略并使用两个串行 AJAX 调用,在第一次调用后更新视图以给人的印象在等待第二次调用完成时响应更快。