Использование NuSoap работает на локальном компьютере, но не на сервере

Я разработал код, который использует классы NuSoap для PHP для вызова мыльного веб-сервиса. Я использую NuSoap, а не нативные классы PHP 5, в основном потому, что не хочу добавлять дополнительные предварительные условия, когда этот код установлен на общем веб-сервере. Код отлично работает на моей машине:

require DOCROOT.'modules/nbn_species_dict_sync/lib/nusoap.php';
$client = new nusoap_client('http://www.nbnws.net/ws_3_5/GatewayWebService?wsdl', true);
$query1 = '<TaxonReportingCategoryListRequest xmlns="http://www.nbnws.net/TaxonReportingCategory" registrationKey="'.$key.'"></TaxonReportingCategoryListRequest>';
$response = $client->call('GetTaxonReportingCategoryList', $query1);

Когда я помещаю это на виртуальный сервер, а не запускаю его локально, последняя строка просто зависает примерно на 10 секунд, а затем PHP взрывается. Никаких исключений не возникает, и PHP-ошибки нет (я пробовал использовать try..catch и set_error_handler, чтобы быть уверенным).

Моей первой реакцией было то, что это может быть брандмауэр, работающий на сервере, блокирующий исходящие запросы, но я успешно использую cUrl в другом месте для запросов, и я почти уверен, что здесь не работает брандмауэр. Вызов $client->use_curl не имеет никакого значения для вызова NuSoap, он все равно не работает.

Любые идеи, почему это может происходить, будут высоко оценены.


person Johnvb    schedule 11.10.2011    source источник
comment
Скорее всего, настройка memory_limit отличается на локальном хосте и сервере, и сервер исчерпывает память.   -  person Maxim Krizhanovsky    schedule 11.10.2011
comment
Спасибо за предложение. Я увеличил лимит памяти до 96 МБ, но это работало только в том случае, если я также вызывал $client-›setGlobalDebugLevel(0). 64М не хватило даже с выключенной отладкой. Я только что проверил, и веб-служба отвечает ~ 2 МБ данных. Кажется странным, что использование памяти в этом случае настолько велико.   -  person Johnvb    schedule 11.10.2011
comment
Я также испытываю аналогичную проблему. У меня есть ответ данных размером 5 МБ от веб-службы, для обработки которого nuSOAP требуется более 256 МБ памяти.   -  person Travis    schedule 03.11.2011
comment
у меня были похожие проблемы, и я отказался от рабочего сервера, попробую это   -  person max4ever    schedule 07.11.2011
comment
Попробуйте получить доступ к URL-адресу в браузере файла wsdl с вашего локального компьютера, а также с виртуальной машины. Вы получаете содержимое wsdl или время ожидания шлюза. Это может сказать вам, что не так.   -  person iWantSimpleLife    schedule 09.11.2011
comment
Итак, я, наконец, заработал, но не решил проблему. Проблема перегрузки памяти конкретно возникает из раздела синтаксического анализа xml nuSOAP, но выяснить, что и почему в этом, было больше, чем я хотел сделать. Мы попытались отсеять все посторонние символы и данные из ответа, но мое решение в конечном счете состояло в том, чтобы разбить запрос на более мелкие части, которые постепенно отображались пользователю по мере их загрузки.   -  person Travis    schedule 04.01.2012


Ответы (2)


Если у вас закончились идеи по устранению неполадок и предполагается, что вы работаете в Linux, вы можете наблюдать за системными вызовами с помощью strace. Вызовы могут выглядеть довольно загадочно, но иногда вы можете увидеть, на каком системном вызове он зависает, а затем погуглить этот вызов для получения дополнительной информации.

strace -p processid

Или, если вы хотите проследить свой сценарий от начала выполнения до конца и вывести его в выходной файл:

strace -o trace.txt myscript.php

Вот хорошее руководство по стратегии.

person Banjer    schedule 10.11.2011

Можете ли вы убедиться, что www-data имеет (разрешение) доступ к

DOCROOT.'modules/nbn_species_dict_sync/lib/nusoap.php' ?

Или вы можете попробовать скопировать nusoap в другой каталог?

Или вы можете попробовать запустить его из командной строки как пользователь root?

Кстати, какую ошибку/предупреждение вы получаете?

person sankar d.    schedule 03.11.2011