Разница между запросом SoapClient и запросом на завивку Soap в php

Я очень смущен тем, что

Soap curl request Я нашел здесь пример SOAP-запрос в PHP с CURL

и запрос Soap с использованием SoapClient PHP http://php.net/manual/en/class.soapclient.php

Мой вопрос и сомнения Во-первых - все ли они выполняют одну и ту же цель.

Второе. Есть ли разница в производительности, если они используются для одной цели.

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

Ответ 1

Вы правы, что они выполняют ту же цель. Тем не менее, SoapClient имеет множество функций для поддержки запросов SOAP, встроенных и также использующих Curl.

Как вы можете видеть в обсуждении SOAP с Curl, программист создает SOAP-огибающую, SoapClient может это сделать для вас. То же самое можно сказать и для выполнения вызовов метода.

В конце концов, намного проще использовать SoapClient.

Ответ 2

Я провел бесчисленные часы работы с SOAP в PHP. Теперь я могу утверждать, что знаю его наизнанку.:)

Первый вопрос: SoapClient и cURL предназначены для разных целей. SoapClient - это все о SOAP, cURL - все о транспорте HTTP. Протокол доступа SOAP является одним уровнем над транспортным протоколом. SOAP может быть передан любым выбранным вами транспортом: часто документ SOAP (который является простым XML-документом) отправляется SMTP (то есть по электронной почте), чтобы проходить через ограничительные брандмауэры. cURL - это просто инструмент для доступа к некоторому веб-серверу.

Второй вопрос: время, затраченное на локальное выполнение, будет минимальным в cURL. Но этому будет противопоставлено низкое качество такого кода, поскольку оно не будет соответствовать стандарту SOAP, и оно обязательно потерпит неудачу так или иначе (и это может даже не дать вам об этом знать). Обычно в процессе выполнения большая часть времени будет потрачена на транспорт (т.е. На медленном сетевом/занятом веб-сервере), поэтому не имеет значения, какой способ вы будете использовать.

Теперь посмотрим под капотом: расширение мыла в PHP довольно неполно. Быстрый поиск слова "фиктивный" дает 33 разных места в коде. Большинство из них php_encoding.c. К сожалению, PHP SOAP в некоторых случаях просто не может создать правильный SOAP или не может понять правильную SOAP - интероперабельность - проблема. Большинство проблем между PHP и .NET SOAP, но я думаю, если вы попытаетесь получить доступ к .NET SOAP с помощью cURL, вам понадобится немного больше, чем несколько строк кода, чтобы это произошло. К счастью, простой SOAP довольно хорош в PHP SOAP и работает с другими реализациями SOAP. Если вы хотите использовать SoapHeaders или mustUnderstand, будьте готовы иметь немного кошмар. SoapHeaders относительно просты в использовании cURL. mustUnderstand будет довольно сложно сделать в cURL.

Основным преимуществом использования SoapClient является WSDL (язык описания веб-сервисов). В основном вы можете:

$client = new SoapClient("http://webserver.com/service.wsdl");
$client->executeRemoteFunction($paramters);

С помощью cURL вы не сможете это сделать, потому что у него нет парсера WSDL. Если удаленный конец изменит свои спецификации, реализация cURL потерпит неудачу и не даст вам знать. На этом этапе вы можете сказать: но если удаленный веб-сервер будет молча потерять executeRemoteFunction(), то я бы тоже не знал! Это не тот случай: SoapClient с выводом SoapFault, и вам нужно поймать его и обработать, или ваш script остановится с необработанным сообщением о исключении. В любом случае вы узнаете об этом.

Однако не ожидайте, что PHP SOAP сделает для вас что-то хорошее, например, проверку типов. Даже если удаленный WSDL потребует xs: integer PHP SOAP будет игнорировать его и будет отправлять любой тип, который вы предоставили бы молча. Проверка типов с помощью cURL? Не может быть сделано, потому что в WSDL нет поддержки.

Также, говоря о SOAP WSDL, имейте в виду, что PHP будет кэшировать WSDL в течение 7 дней (настройка по умолчанию). Быстрые изменения WSDL во время разработки мгновенно избавят вас от необходимости: очистка кеша WSDL не всегда легко. Но с другой стороны, вы можете полностью отключить кеш WSDL во время разработки: скорость пойдет вниз, но по крайней мере вы сможете развиваться, не имея "я не знаю, почему он не делает то, что я хочу!"

Поэтому, читая несколько хороших вещей в PHP SOAP, вы можете подумать, есть ли веские основания использовать cURL для SOAP. И мой ответ "да", есть. К сожалению, PHP SOAP не может создавать определенные типы SoapHeader. Поэтому, если вы перейдете к таким передовым материалам, вам нужно будет использовать SoapClient для создания документа SOAP, а затем изменить его с помощью некоторых инструментов XML (например, PHP DOM), а затем отправить его с помощью cURL. Но это совсем другая история.

Если вы только начинаете с SOAP в PHP, сделайте себе одолжение и придерживайтесь расширения PHP SOAP, а не cURL. Это более чистый способ работы с SOAP, он быстрый, поддерживается расширение (поэтому ожидайте, что его функциональная совместимость в конечном итоге повысится), он понимает WSDL и обеспечивает хорошую отчетность об ошибках и обработку.

Ответ 3

Первый вопрос: Честно говоря, они заполняют ту же самую нишу в концепции. Возможно, будет время, когда вы думаете, что "лучше" "распечатать" xml после некоторой модификации, рассматривая его как строку, а не строить и отправлять через мыло. curl может делать больше, чем это, но когда применяется к контексту вызова ws soap, просто SOAP обрабатывает запрос как "сложный" объект, тогда как для curl ваше сообщение является строкой простой и простой.

Второй вопрос: этот я не могу дать никакого определенного ответа. Я знаю, что вы можете сделать несколько сообщений с завихрением, но я никогда не замечал какого-либо конкретного удара по производительности, плюс есть некоторые рамки, такие как зебра, которые обертывают php curl для ( предположительно), но я никогда не пробовал их... Но в конечном итоге завиток будет делать не больше, чем "отправить" строку в случае мыльной завивки. Я сомневаюсь, что может быть какая-то определенная деградация производительности.