Вопрос

Я работал над сценарием на 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 сообщает вашему клиенту, где находится конечная точка операций, так что вам не нужно об этом беспокоиться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top