На моем 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
для меня это явное доказательство того, что медлительность исходит от их стороны, я прав?