По моему опыту, все не так просто. Встроенный PHP SOAP-клиент не работал с SOAP-сервером на основе .NET, который мы должны были использовать. Он пожаловался на неверное определение схемы. Хотя клиент .NET работал с этим сервером просто отлично. Кстати, позвольте мне утверждать, что совместимость SOAP - это миф.
Следующим шагом было NuSOAP . Это работало довольно долго. Кстати, ради бога, не забудьте кэшировать WSDL! Но даже с кешированными пользователями WSDL чертовски медленно.
Затем мы решили использовать пустой HTTP, собирая запросы и читая ответы с помощью SimpleXMLElemnt
, например:
$request_info = array();
$full_response = @http_post_data(
'http://example.com/OTA_WS.asmx',
$REQUEST_BODY,
array(
'headers' => array(
'Content-Type' => 'text/xml; charset=UTF-8',
'SOAPAction' => 'HotelAvail',
),
'timeout' => 60,
),
$request_info
);
$response_xml = new SimpleXMLElement(strstr($full_response, '<?xml'));
foreach ($response_xml->xpath('//@HotelName') as $HotelName) {
echo strval($HotelName) . "\n";
}
Обратите внимание, что в PHP 5.2 вам понадобится pecl_http, поскольку (сюрприз-сюрприз!) Нет встроенного HTTP-клиента.
Переход на чистый HTTP позволил нам увеличить время запросов SOAP более чем на 30%. И с тех пор мы перенаправляем все жалобы на производительность парням на сервер.
В конце я бы рекомендовал этот последний подход, а не из-за производительности. Я думаю, что в общем случае в динамическом языке, таком как PHP, не дает никакой выгоды от всех этих WSDL / контроль типов. Вам не нужна шикарная библиотека для чтения и записи XML со всеми этими поколениями заглушек и динамическими прокси. Ваш язык уже динамичен, и SimpleXMLElement
отлично работает и очень прост в использовании. Кроме того, у вас будет меньше кода , что всегда хорошо.