Очень медленный SOAP-запрос - PullRequest
0 голосов
/ 28 июня 2019

На моем 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 SOAP-вызова на эти 2 разных URL с одинаковыми данные и выполнение того же метода. Сценарий выглядит так:

<?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

для меня это явное доказательство того, что медлительность исходит от их стороны, я прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...