Переход с NuSOAP на PHP5 SOAP
Вопрос
Я работал над сценарием на PHP4, который опирается на NuSOAP. Теперь я пытаюсь переместить это в PHP5 и использовать встроенную поддержку SOAP.
$wsdlPath = ""; // I have obviously set these variables to something meaningful, just hidden for the sake of security
$apiPath = "";
$username = "";
$password = "";
// PHP5 style
$client = new soapclient($wsdlPath, array('login'=>username,
'password'=> $password,
'soap_version'=> SOAP_1_2,
'location'=> $apiPath,
'trace'=> 1));
// PHP4/NuSOAP style
$client = new soapclient($wsdlPath, true);
client->setEndpoint($apiPath);
$client->setCredentials($username, $password);
$client ->loadWSD);
PHP5-версия генерирует следующую трассировку стека исключений:
EXCEPTION=SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://external-nbb.napi.norwegian.no.stage.osl.basefarm.net/api/napi1300?wsdl' in /home/eisebfog/public_html/database/norwegian.php:31
Stack trace:
#0 /home/eisebfog/public_html/database/norwegian.php(31): SoapClient->SoapClient('http://external...', Array)
#1 /home/eisebfog/public_html/database/index.php(53): require_once('/home/eisebfog/...')
#2 {main}
Теперь, когда работает версия NuSOAP, а чистый PHP5 - нет, мозговому хирургу не требуется, чтобы понять, что я делаю что-то не так. У меня есть доступ к файлу .htaccess, и с помощью phpinfo () я убедился, что я правильно запускаю NuSOAP и PHP5, когда мне нужно, и PHP4 / Nusoap, когда мне нужно.
По сути, я не очень хорошо разбираюсь в веб-сервисах и мыле, но если у кого-то есть какие-либо идеи, я был бы признателен за любую информацию о том, что я делаю неправильно, и как я могу перейти на родное мыло в PHP5. Кстати, резонанс, который я хочу, чтобы этот шаг, во-первых, предполагаемая экономия ресурсов в родном мыле. Буду признателен за любые ссылки на тесты между этими двумя решениями.
Решение
Убедитесь, что NuSoap и PHPv5-SOAP работают на одном сервере. Если я не совсем ошибаюсь, обе библиотеки используют одно и то же имя класса. Может быть, это будет работать лучше, если вы убедитесь, что ни один NuSopa-файл не включен? А также убедитесь, что SOAP-библиотека загружена:
if(!extension_loaded('soap')){
dl('soap.so'); // Actually a deprecated method. See "notes" at http://no.php.net/dl
}
Полагаю, что поле версии, на которое вы ссылаетесь, определено как " SOAP 1.1 " или похож?
С наилучшими пожеланиями:)
Кстати: над чем вы работаете? Обмен задержками от пилота до аэропорта? Или, возможно, веб-сервис, который сократит время ожидания при доставке багажа в Осле? : Р <р>Другие советы
У нас были очень похожие проблемы со встроенным SOAP-клиентом PHP5, пытающимся использовать Web-сервис на основе .NET. Также не удалось проанализировать WSDL, сообщив о недопустимой схеме. Поместить определения схемы в один локальный файл не помогло.
Мы прекратили попытки и переключились на NuSOAP, который сработал.
Однако NuSOAP тоже далек от совершенства. Прямо сейчас я попадаю в ситуацию нехватки памяти при разборе 1MB + ответов. Стирание всего неприятного кода отладки немного помогло, но не радикально.
Таким образом, похоже, что в настоящее время в PHP нет 100% совместимой / функциональной реализации SOAP-клиента.
Без тестирования у меня есть два предложения:
Во-первых, установите максимально допустимое значение error_reporting (до создания SoapClient):
error_reporting( E_ALL );
Если что-то не так с аутентификацией на стороне сервера, PHP выдаст предупреждения. В большинстве случаев он скажет вам, что пошло не так.
Во-вторых: я не знаю, можете ли вы указать параметр 'location' вместе с URL-адресом для wsdl. Теоретически, wsdl сообщает вашему клиенту, где находится конечная точка операций, так что вам не нужно об этом беспокоиться.