我们目前正在寻求在一个严重依赖Soap网络服务的网站上进行一些性能调整。但是......我们的服务器位于比利时,我们连接的网络服务位于旧金山,所以这是一个长途连接至少可以说。
我们的网站是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;
}
答案 0 :(得分:5)
因此,根本问题是您必须执行的请求数量。那么创建分组服务呢?
答案 1 :(得分:3)
PHP.INI
output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off
答案 2 :(得分: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_time
,namelookup_time
,connect_time
,pretransfer_time
,starttransfer_time
和redirect_time
的元素。从这些你应该能够弄清楚它是dns,请求,实际的肥皂服务器还是占用时间的响应。
我刚刚想到的一个显而易见的事情是您是通过域还是IP请求SOAP服务器?如果您正在使用域名,那么您的dns可能会显着降低速度(尽管它会在几个阶段进行缓存)。检查您当地的DNS时间(在您的soap客户端或php.ini中 - 不确定)和域的TTL(在DNS区域中)。为SanFran服务器设置一个静态IP,如果没有,则以这种方式引用它。
答案 3 :(得分:2)
使用缓存和HTTP压缩优化服务器(而不是客户端!)HTTP响应。查看雅虎http://developer.yahoo.com/performance/rules.html
的提示答案 4 :(得分:1)
1您可以断言您的soap服务器使用gzip压缩来获取http内容,以及您的网站输出。对SF的0.7s综述似乎有点长,无论是web服务还是很久都要回答,要么存在重要的自然延迟。 如果可以,请尝试其他托管公司为您的比利时服务器,在法国,有些人可以更好地连接到美国。 我经历过将网站从一个主机移动到另一个主机,巴黎和纽约之间的网络延迟几乎翻了一番!这是非常的,我的客户与很多美国访客对此感到不满。 将Web服务器重定位到SF的解决方案可以是一个选项,您可以在服务器之间获得更好的连接,但如果访问者主要位于欧洲,请注意延迟。
2您可以使用操作码缓存机制,例如xcache或APC。它不会改变soap延迟,但会改善php执行时间。
3根据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处理结果(比如模板渲染输出和其他资源消耗操作)。使用这种技术取得成功的关键是要确切知道哪部分是缓存的,以及它将保持多久才能保持清爽。
答案 5 :(得分:-1)
任何使用AJAX界面的机会..如果请求可能在后台发生,您似乎不会等待响应。