Php SoapClient очень медленно при первом подключении - PullRequest
0 голосов
/ 01 октября 2019

Я использую php SoapClient для вызова веб-сервисов M3 (Movex), хранящихся на нашем внутреннем сервере. Мой проект Symfony 3.4, который выполняет вызовы, находится на другом внутреннем Linux-сервере.

Я заметил, что инициализация мыльного клиента очень медленная (2-3 минуты), когда она выполняется после долгого времени безиспользуя его (несколько часов). Например, это происходит утром, когда я тестирую свой проект в первый раз за день. Но у меня нет проблем с каждой инициализацией и вызовами, выполняемыми через несколько минут (отвечает через 500 мс).

Поскольку 1-й процесс инициализации занимает несколько минут, мой сервер nginx возвращает ошибку времени ожидания шлюза 504 через 1 минуту.

URL-адреса веб-сервисов находятся в HTTPS, и мы используем SSL-сертификаты. Мы также должны были пройти аутентификацию с помощью логина и пароля. Я использую сеансовый cookie-файл, доступный в течение 8 часов, который добавляю в заголовок HTTP-запроса. Мы не используем прокси.

Я думаю, что это проблема с кешем . Когда я использую SoapUI, у меня нет проблемы, веб-сервис реагирует очень быстро.

Вот конфигурация расширения мыла в моем php.ini:

enter image description here

Вот мой init-файл мыльного клиента:

$client = new SoapClient("https://my-domain.com:55080/my-webservice?wsdl", array(
  'login'     => $login,
  'password'  => $pwd,
  'trace'     => true,
  'exceptions' => true,
  'stream_context' => stream_context_create(array(
    'http' => ['header' => 'cookie: ' . $cookie]
  ))
));

Я пытался добавить 'cache_wsdl' => WSDL_CACHE_MEMORY в настройках, но это хуже, каждый раз, когда я его использую,это очень медленно.

Вот журналы, чтобы увидеть, где возникает проблема (посмотрите на строки 3 и 4 -> 2 минуты):

01/10/19 09:58:06 ------- Get Customer -------
01/10/19 09:58:06 - Cookie exists -> send it in the request
01/10/19 09:58:06 - BEGIN Init soap client
01/10/19 10:00:07 - END Init soap client
01/10/19 10:00:07 - BEGIN client->GetCustomerData
01/10/19 10:00:07 - END client->GetCustomerData
01/10/19 10:00:07 ------- END Get Customer -------

Когда я проверяю это снова через несколько минут(без проблем, сделано в ту же секунду):

01/10/19 10:03:52 ------- Get Customer -------
01/10/19 10:03:52 - Cookie exists -> send it in the request
01/10/19 10:03:52 - BEGIN Init soap client
01/10/19 10:03:52 - END Init soap client
01/10/19 10:03:52 - BEGIN client->GetCustomerData
01/10/19 10:03:52 - END client->GetCustomerData
01/10/19 10:03:52 ------- END Get Customer -------

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Загрузите файл wsdl и поместите его на тот же сервер, на котором мой проект решил проблему.

У меня нет задержки при инициализации мыльного клиента. И я тоже отключил кеш. Теперь он отлично работает.

$client = new SoapClient("https://". $_SERVER['HTTP_HOST'] ."/path-to/file.xml", array(
  'login'      => $login,
  'password'   => $pwd,
  'trace'      => true,
  'exceptions' => true,
  'cache_wsdl' => WSDL_CACHE_NONE,
  'stream_context' => stream_context_create(array(
    'http' => ['header' => 'cookie: ' . $cookie]
  ))
));
0 голосов
/ 02 октября 2019

В качестве ответа на ваш вопрос в ваших комментариях вы можете попытаться замаскировать ваш мыльный клиент под браузер. Это может быть возможным решением. Нет гарантии, что это единственное и единственное решение. ;)

// options
$wsdl = 'https://your.service.url.here?wsdl';

$options = [
    'trace' => true,
    'exceptions' => true,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'connection_timeout' => 30,
    'user_agent' => 'Mozilla/1.0N (Windows)',
];

try {
    $client = new SoapClient($wsdl, $options);
    // more logic here
} catch (SoapFault $e) {
    var_dump($e);
}
...