在我的php网站中,每当保存用户时,都会通过SOAP向外部API发出请求。该请求需要很长的时间+20秒。
试图找到瓶颈,我已经放了一些日志,我发现构造函数不是问题(0.0005秒),实际的调用是。
这是我班级的样子:
Myclass extends SoapClient
{
public function __construct($wsdl = null, $options = array())
{
$start = microtime(true);
parent::SoapClient($wsdl, $options);
$end = microtime(true);
// $end-$start = 0.0005s
}
public function sendUserData($userData)
{
$start = microtime(true);
$result = $this->__soapCall('TriggerCampaign', array($userData));
$end = microtime(true);
// $end-$start = 24.77s
}
}
在我的本地计算机上,__soapCall
最多花费1秒,在测试环境上,大约需要半秒,而在生产环境中,最多需要30秒。构造函数在所有环境中花费0.0005秒。
外部API表示它并非源于其目的。
从我的微型日志记录中,我相信确实如此。
是否有可能它们是正确的,并且我的生产环境中有一些东西使得请求如此缓慢?
我如何对此问题进行更深入的调试才能找到罪魁祸首?
修改
我记得发布后外部API有备用URL,所以为了确定问题是在我这边还是在我这边,我制作了一个快速而肮脏的脚本,在其中我用相同的代码对这2个不同的URL进行了2次SOAP调用数据并执行相同的方法。脚本如下所示:
<?php
$constructorStart1 = microtime(true);
$soapClient1 = new SoapClient('http://url1.com?WSDL');
$constructorEnd1 = microtime(true);
$header1 = array(
'Login' => 'login1',
'Password' => 'password1'
);
$headers1 = new SoapHeader('http://tempuri.org/', 'AutomationAuthHeader', $header1);
$soapClient1->__setSoapHeaders($headers1);
$args1 = array(
'GateName' => 'UPDATE_MEMBER',
'InputData' => array(
//some values
)
);
$callStart1 = microtime(true);
$soapClient1->__soapCall('TriggerCampaign', $args1);
$callEnd1 = microtime(true);
echo 'SOAP url: url1.com?WSDL' . "<br>";
echo 'SOAP construtor time: ' . number_format($constructorEnd1 - $constructorStart1, 4) . "<br>";
echo 'SOAP call time: ' . number_format($callEnd1 - $callStart1, 4) . "<br><br>";
$constructorStart2 = microtime(true);
$soapClient2 = new SoapClient('http://url2.com?WSDL');
$constructorEnd2 = microtime(true);
$header2 = array(
'Login' => 'login2',
'Password' => 'password2'
);
$headers2 = new SoapHeader('http://tempuri.org/', 'AutomationAuthHeader', $header2);
$soapClient2->__setSoapHeaders($headers2);
$args2 = array(
'GateName' => 'UPDATE_MEMBER',
'InputData' => array(
//some value
)
);
$callStart2 = microtime(true);
$soapClient2->__soapCall('TriggerCampaign', $args2);
$callEnd2 = microtime(true);
echo 'SOAP url: http://url2.com?WSDL' . "<br>";
echo 'SOAP construtor time: ' . number_format($constructorEnd2 - $constructorStart2, 4) . "<br>";
echo 'SOAP call time: ' . number_format($callEnd2 - $callStart2, 4) . "<br>";
我得到的结果是:
SOAP url: http://url1.com?WSDL
SOAP construtor time: 0.0004
SOAP call time: 0.1568
SOAP url: http://url2.com?WSDL
SOAP construtor time: 0.0002
SOAP call time: 22.1807
对我来说,确定性是缓慢的原因来自他们,我正确吗?