【问题标题】:Speeding up a soap powered website加速肥皂驱动的网站
【发布时间】:2010-04-13 13:58:51
【问题描述】:

我们目前正在研究对严重依赖 Soap Web 服务的网站进行一些性能调整。但是......我们的服务器位于比利时,我们连接的网络服务位于旧金山,因此至少可以说是长途连接。

我们的网站由 PHP 驱动,使用 PHP 内置的 SoapClient 类。 平均而言,调用 Web 服务需要 0.7 秒,我们每页执行大约 3-5 个请求。所有可能的请求/响应缓存都已实现,因此我们现在正在寻找其他方法来提高连接速度。

这是实例化 SoapClient 的代码,我现在正在寻找的是其他方式/方法来提高单个请求的速度。有人有想法或建议吗?

private function _createClient()
{
    try {

        $wsdl = sprintf($this->config->wsUrl.'?wsdl', $this->wsdl);
        $client = new SoapClient($wsdl, array(
            'soap_version'       => SOAP_1_1,
            'encoding'           => 'utf-8',
            'connection_timeout' => 5,
            'cache_wsdl'         => 1,
            'trace'              => 1,
            'features'           => SOAP_SINGLE_ELEMENT_ARRAYS
        ));

        $header_tags = array('username' => new SOAPVar($this->config->wsUsername, XSD_STRING, null, null, null, $this->ns),
                             'password' => new SOAPVar(md5($this->config->wsPassword), XSD_STRING, null, null, null, $this->ns));
        $header_body = new SOAPVar($header_tags, SOAP_ENC_OBJECT);
        $header = new SOAPHeader($this->ns, 'AuthHeaderElement', $header_body);

        $client->__setSoapHeaders($header);

    } catch (SoapFault $e){
        controller('Error')->error($id.': Webservice connection error '.$e->getCode());
        exit;
    }

    $this->client = $client;
    return $this->client;
}

【问题讨论】:

  • 如果您无法将服务器迁移到旧金山,您可以尝试迁移比利时。我认为有一个 python 模块可以做到这一点。

标签: php performance soap soap-client


【解决方案1】:

因此,根本问题是您必须执行的请求数量。如何创建分组服务?

  • 如果您负责 Web 服务,您可以创建专门的 Web 服务来同时执行多项操作,这样您的主应用程序每页只能执行一个请求。
  • 如果没有,您可以将您的应用服务器重新定位在 SF 附近。
  • 如果无法重新定位所有服务器并且您无法创建新的专用 Web 服务,您可以在 Web 服务服务器附近添加一个网桥。该桥将提供专门的 Web 服务并负责调用原子 Web 服务。例如,您应该使用 0.7s + 5 * 0.1 而不是 0.7s * 5。

【讨论】:

  • +1 为旅,我不负责 WS 本身,但一座桥可能是一个有效的解决方案!
【解决方案2】:

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off

【讨论】:

  • 谢谢!看起来很明显,并且会检查,但我正在寻找一种相当实用的方法,而不是调整 php 设置,顺便说一下,这些设置已经像你建议的那样设置了:) 谢谢你的建议!
  • 其实zlib.output_compression比ob_gzhandler更受欢迎。
  • @ChrisRamakers - 我将肥皂用于内部应用程序。我添加的功能之一是发送格式参数,它允许我在一个节点中获取 json 格式的数据集。我检索数据,然后允许客户端设置数据。这有帮助,因为主体响应的长度更短,因为 ... 次 200 已被替换为 {....}
【解决方案3】:

您确定是网络延迟降低了每个请求的速度吗?正如 Benoit 所说,0.7s 似乎是一个很长的周期。我会考虑做一些基准测试——你可以用 curl 来做这件事,虽然我不确定这将如何与你的肥皂客户端一起工作。

类似:

$ch = curl_init('http://path/to/sanfrancisco/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
$info = curl_getinfo($ch);

$info 将返回一个数组,其中包含 total_timenamelookup_timeconnect_timepretransfer_timestarttransfer_timeredirect_time 的元素。从这些您应该能够确定是 dns、请求、实际的 soap 服务器还是占用时间的响应。

我刚刚想到的一件显而易见的事情是,您是通过域还是 IP 请求 SOAP 服务器?如果您使用的是域,您的 dns 可能会显着减慢速度(尽管它会在几个阶段被缓存)。检查您的本地 dns 时间(在您的 soap 客户端或 php.ini - 不确定)和您的域的 TTL(在您的 DNS 区域中)。为您的 SanFran 服务器设置一个静态 IP,如果还没有,请以这种方式引用它。

【讨论】:

  • 往返确实是 0.7 - 0.5 s ...这不是一个简单的网络命令,如 ping,但服务器上也会发生一些处理,如果无法从缓存中获取,通常需要一些时间。
  • 是的 - 我不是在建议 ping。分解 0.7 秒 - 包括对实际应用的一些基准测试。
  • @Chris 如果对 WS 服务器的 ping 速度很快,那么距离(很可能)不是您的问题 :)
【解决方案4】:

通过使用缓存和 HTTP 压缩来优化服务器(而不是客户端!)HTTP 响应。查看 yahoo http://developer.yahoo.com/performance/rules.html 的提示

【讨论】:

    【解决方案5】:

    1 您可以断言您的soap 服务器对http 内容使用gzip 压缩,以及您的站点输出。对 SF 的 0.7 秒综述似乎有点长,要么是 web 服务很长,要么是有一个重要的网络延迟。 如果可以,请尝试为您的比利时服务器尝试其他托管公司,在法国,有些公司与美国的连接比其他公司要好得多。 我经历过将网站从一个主机移到另一个主机,巴黎和纽约之间的网络延迟几乎翻了一番!太好了,我有很多美国游客的客户对此很不满意。 将网络服务器重新定位到 SF 的解决方案是一种选择,您将在服务器之间获得更好的连接,但如果您的访问者主要位于欧洲,请注意延迟。

    2 您可以使用操作码缓存机制,例如 xcache 或 APC。它不会改变soap延迟,但会提高php执行时间。

    3 根据soap 请求是否重复,以及内容更新可以延长多长时间,您可以使用soap 结果上的缓存对其进行真正的改进。我建议您使用内存缓存系统(如xcache/memcached 或其他),因为它们比文件或数据库缓存系统快得多。

    在您的课程中,createclient 方法并不是最适合缓存的示例功能,但对于任何读取操作,它只是执行性能的最佳方式:

    private function _createClient()
    {
      $xcache_key = 'clientcache'
      if (!xcache_isset($key)) {
          $ttl = 3600; //one hour cache lifetime
          $client = $this->_getClient(); ///private method embedding your soap request          
          xcache_set($xcache_key, $client, $ttl);
          return $client;
       }
       //return result form mem cache
       return xcache_get($xcache_key);
    }
    

    这个例子是针对 xcache 扩展的,但是你可以以非常相似的方式使用其他系统

    4 更进一步,您可以使用类似的机制来缓存您的 php 处理结果(如模板渲染输出和其他资源消耗操作)。这种技术成功的关键是确切地知道缓存的部分以及它将保持多长时间而不刷新。

    【讨论】:

    • 我们最近实现了一种缓存机制,该机制取决于我们在 WS 中记录的最后更新时间。并且客户端缓存也已经到位。我并不是说我们已经将所有内容都推到了最大值,但与超过 5 个需要 0.5 秒的请求相比,收益将是微不足道的。在地理上重新分配服务器也可能有效,但我们所有的访问者/用户都来自比利时和荷兰,因此将我们的服务器移至美国会在整个网站上引入一般延迟。
    • 好的,看来唯一要评估的选择是 WS 服务器优化或更好地迁移到比利时。我见过的性能最好的 SOA 托管在同一个地方、同一个机架上,但我知道该解决方案从一开始就有这种架构
    【解决方案6】:

    任何使用 AJAX 接口的机会。如果请求可以在后台发生,您似乎不会等待响应。

    【讨论】:

    • 它们仍然需要同样长的时间来加载
    猜你喜欢
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2017-01-16
    相关资源
    最近更新 更多