2013-03-28 2 views
9

Я новичок в веб-сервисах. Я испытываю необъяснимо случайное время выполнения конструктора SoapClient. Обычно вызов занимает около 10 секунд. Иногда это занимает менее одной секунды, но это явление встречается реже.PHP SoapClient конструктор очень медленный

PHP SoapClient Constructor extremely slow

PHP: SoapClient constructor is very slow (takes 3 minutes)

Connecting to WCF Web Service is inexplicably slow

Моя ситуация похожа на те, в вышеупомянутых нитей, но решения, предложенные в них не решить мою проблему.

// config params 
$params = array(
    'trace'  => 1, 
    'soap_version' => SOAP_1_1, 
    'cache_wsdl' => WSDL_CACHE_MEMORY 
); 
// this call takes about 10 seconds to remote WSDL 
$soap_client = new SoapClient(WSDL_URL,$params); 

Я играл с различными параметрами кэширования и WSDL нашел WSDL_CACHE_MEMORY быть самым быстрым. При использовании других параметров кэширования вызов занимает в среднем около 25 секунд.

Я не пользуюсь несколькими пользователями.

Я изменил wsdl_cache_dir в дружественный Windows каталог в php.ini.

Мой вопрос два раза:

  1. Почему конструктор SoapClient, казалось бы, случайным образом в том, как долго это берет, чтобы выполнить? Почему это обычно занимает больше времени, но иногда требуется только секундная смена? Есть ли тест, который я могу выполнить, чтобы узнать, почему он ведет себя таким образом?

  2. Должен ли я кэшировать/сохранять объект SoapClient или ресурс, чтобы при перемещении посетителей моей страницы со страницы на страницу мне не нужно было создавать новый SoapClient и повторно разбирать WSDL? Каков рекомендуемый подход для этого?

Любая помощь или толчок в правильном направлении были бы очень важны. Спасибо.

+0

ли файл WSDL локальный или удаленный? – datasage

+0

@ datasage Я попробовал оба. Сначала локальный, затем удаленный. Более быстрое время выполнения с помощью пульта. – cre8value

+0

попытаться создать тестовый клиент с soapui - http://www.soapui.org/ тоже медленно? – herrjeh42

ответ

11

Проверьте TTL

TTL определяет, как долго WSDL живет в кэше.

soap.wsdl_cache_ttl integer 

Устанавливает количество секунд (время жить), что кэшированные файлы будут использоваться вместо оригиналов.

http://www.php.net/manual/en/soap.configuration.php#ini.soap.wsdl-cache-ttl

Хранить WSDL локально

Также вы можете загрузить WSDL в локальной файловой системе и использовать его в качестве источника для SoapClient

$client = new SoapClient("file://path/wsdl.file", array(
    'location' => "http://domain/ws-endpoint", 
)); 
+0

+1 для идеи локальной копии. – GordonM

Смежные вопросы