SOAP请求非常慢

时间:2019-06-28 13:37:10

标签: php soap

在我的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

对我来说,确定性是缓慢的原因来自他们,我正确吗?

0 个答案:

没有答案