PHP: конструктор SoapClient работает очень медленно (занимает 3 минуты)

Я новичок в PHP. После многих поисков мне удалось каким-то образом использовать мой веб-сервис, созданный Java с PHP, но проблема заключается в том, что конструктор класса SoapClient очень медленный. Вот мой PHP-код:

<? require_once('SOAP/Client.php'); $url = "http://127.0.0.1:8024/_RS?wsdl"; $sc = new SoapClient($url); ?> 

Это занимает до 3 минут несколько раз. Я не знаю, в чем проблема. После создания конструктора я мог бы использовать его в цикле for 50 раз за 1 секунду, поэтому я уверен, что конструктор – это часть, которая замедляет мой код.

Как вы думаете, что вызывает проблему?

Заранее спасибо.

PS: Дополнительная информация в моем другом вопросе: https://stackoverflow.com/questions/5929669/call-a-wsdl-web-service-created-by-java-from-nushphere-phped

PPS: Как было предложено AJ, я использовал XDebug и kcachegrind для анализа проблемы. Как вы можете видеть, я был прав. Вот картина: XDebug приводит к kcachegrind как в% (вверх), так и во времени (вниз).

Solutions Collecting From Web of "PHP: конструктор SoapClient работает очень медленно (занимает 3 минуты)"

У меня такая же проблема. Php SoapClient очень быстро работает с тем же webservice, установленным на Tomcat. Я попытался сделать «wget», чтобы узнать, были ли заголовки в ответе разными, и поскольку проблема связана с кэшированием WSDL, я обнаружил, что это может быть причиной:

С Tomcat:

 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/xml;charset=utf-8 Content-Length: 23925 Date: Thu, 08 Mar 2012 23:13:10 GMT Connection: keep-alive 

С Endpoint.publish (…)

 HTTP/1.1 200 OK Content-type: text/xml;charset=utf-8 Content-length: 23837 

Теперь мне просто нужно выяснить, как заставить Endpoint.publish(...) вставить Server , Date или Connection заголовок.

(Изменить) Я нашел решение: проблема связана не только с данными Chunked, но и с «Keep-Alive». Этого можно предотвратить, установив заголовок «Соединение: Закрыть» в stream_context. См. Ниже:

 class ImprovedSoapClient extends SoapClient { public function __construct($wsdlLocation) { parent::__construct( $wsdlLocation , array( , 'cache_wsdl' => WSDL_CACHE_NONE , 'stream_context'=>stream_context_create( array('http'=> array( 'protocol_version'=>'1.0' , 'header' => 'Connection: Close' ) ) ) ) ); } } 

Я бы предположил, что это не конструктор PHP-класса, но вместо этого он, вероятно, делает первый вызов вашей веб-службы Java – до того, как какие-либо объекты были инициализированы в приложении Java.

Но вы должны это точно определить, используя инструмент профилирования PHP, например Xdebug:

http://www.xdebug.org/docs/profiler

Это выглядит довольно похоже на вашу проблему: http://www.ozonesolutions.com/programming/2011/05/nsclient-login-time/. Его использование php toolkit вместо java, но решение все равно может применяться.