Php fatal error soap error parsing wsdl

Не создает SOAP клиент

Из платформы 8.3.2.163 опубликовал веб-сервис на IIS 5.1.
Установил PHP 5.3.271
Сделал файл index.php:

При открытии http://localhost/index.php получаю ошибку:
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://localhost/InfoBase4/ws/wsnomen.1cws?wsdl’ : failed to load external entity «http://localhost/InfoBase4/ws/wsnomen.1cws?wsdl" in C:\Inetpub\wwwroot\index.php:5 Stack trace: #0 C:\Inetpub\wwwroot\index.php(5): SoapClient->SoapClient(‘http://localhos. ‘) #1 thrown in C:\Inetpub\wwwroot\index.php on line 5

т.е. там нет точки-запятой перед скобкой, подставляется почему то автоматически при публикации в форуме

Обнаружил, что если в пхп написать
$client = new SoapClient(«bugaga»);
то ошибку выдает точно такую же.

А если например:
$client = new SoapClient_(«bugaga»);
то ошибка меняется
Fatal error: Class ‘SoapClient_’ not found in C:\Inetpub\wwwroot\index.php on line 5

(8) интересно. Установил, запустил ПХП. Просит пароль. Переустановил IIS, настроил у него ПХП, раздал права на папки. Пароль требовать перестал, но и ссылку
http://127.0.0.1/otladka/ws/lyay.1cws?wsdl
теперь не видит. Разбираюсь.

Заработало.
Подставил прилагаемый к примеру default.vrd и возможно (точно не помню)затронул настройки безопасности IIS/Свойства: otladka/Безопасность каталога/Анонимный доступ и проверка подл./Изменить. Установлены флаги:
Анонимный доступ
Разрешить управление паролем из ИИС
+Указано имя пользователя
На вкладке «Виртуальный каталог» кроме прочих доступны поля:
Локальный путь
Имя приложения
+кнопка Настройка

Еще вероятнее всего повлияло:
В конфигураторе при публикации Имя: otladka
где то на мисте читал что оно должно соответствовать названию своего каталога (C:\Inetpub\wwwroot\otladka\)

И еще одна любопытная деталь:
Если сейчас обращусь по адресу http://127.0.0.1/index.php
без вопросов откроется пример
А если ввести адрес
http://127.0.0.1/otladka/ws/lyay.1cws?wsdl
То спросит логин и пароль. В этом примере, в PHP файле указаны логин и пароль: ‘site’
Так вот они подходят, что странно, учитывая что я их нигде не вводил ранее.

(0) кстати объявление «new SoapClient» , в соответствии с примером у меня теперь выглядит немного сложнее:

Источник

PHP SOAP error catching

I’m getting desperate, all I want is simple error handling when the PHP SOAP Web Service is down to echo an error message login service down. Please help me! At the moment it’s still displaying the error (along with warnings. ): Fatal error: SOAP-ERROR: Parsing WSDL Here is the script:

login(array('username'=>$username, 'password'=>$password)); $result = $array->return; >catch(SoapFault $client) < $result = "0"; >if($result == "true")//as this would be what the ws returns if login success < $_SESSION['user'] = $login; echo "00"; >else < echo "01 error: login failed"; >?> 

Honestly, any fatal error in the SOAP extension should be reported as a bug since there is no case in which your code should cause a fatal error. 404 WSDL should be a SoapFault as you expect.

7 Answers 7

UPDATE July 2018

If you don’t care about getting the SoapFault details and just want to catch any errors coming from the SoapClient you can catch «Throwable» in PHP 7+. The original problem was that SoapClient can «Fatal Error» before it throws a SoapFault so by catching both errors and exceptions with Throwable you will have very simple error handling e.g.

If you need to catch the SoapFault specifically, try the original answer which should allow you to suppress the fatal error that prevents the SoapFault being thrown

Original answer relevant for older PHP versions

SOAP can fatal error calling the native php functions internally which prevents the SoapFaults being thrown so we need to log and suppress those native errors.

First you need to turn on exceptions handling:

try < $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array( 'exceptions' =>true, )); > catch ( SoapFault $e ) < // Do NOT try and catch "Exception" here echo 'sorry. our service is down'; >

AND THEN you also need to silently suppress any «PHP errors» that originate from SOAP using a custom error handler:

set_error_handler('handlePhpErrors'); function handlePhpErrors($errno, $errmsg, $filename, $linenum, $vars) < if (stristr($errmsg, "SoapClient::SoapClient")) < error_log($errmsg); // silently log error return; // skip error handling >> 

You will then find it now instead trips a SoapFault exception with the correct message «Soap error: SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘. ‘» and so you end up back in your catch statement able to handle the error more effectively.

Источник

PHP SOAP wsdl Fatal Error & Xdebug

I really don’t understand what’s happening with PHP SOAP library I use a SOAP service, it’s working well but sometimes i have the well-know «Fatal error: SOAP-ERROR: Parsing WSDL: . » I have read that this error was uncatchable because Xdebug was on and that the solution is to disable it to be able to catch the error. but i doesn’t work ! the error is displayed with the orange and red colors do you have an idea ?? (I use the last version of wamp, i don’t know how to check if i choosed 64 or 32bits but it’s apache 2.2.22, php 5.3.13) thanks in advance for your help ! 🙂

 - Warning: SoapClient::SoapClient -> "failed to open stream . " - Warning: SoapClient::SoapClient -> "failed to load external entity . " - Fatal error: SOAP-ERROR: Parsing WSDL -> "Couldn't load from . " 

and sometimes, just the fatal error I have placed an echo just after the line new SoapClient(. and when there’s an uncatched error, the echo is not displayed I have to add that I call SoapClient with ‘trace’ => 1, ‘exceptions’ => 1, and i have this in apache error log (** used to hide)

[Thu Jan 31 16:16:02 2013] [error] [client 127.0.0.1] PHP Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://******?wsdl' : Start tag expected, ' 
  • I have installed visual basic 2012 (evaluation 😉 )
  • used the visual basic command console (start > Micrososft Visual Studio 2012 > Visual studio tools)
  • checked the sire typing "cd ***my_path_containing_apache_bin_directory**\bin dumpbin /all httpd.exe | find "stack"" (is was " 40000 size of stack reserve " )
  • increase the size typing editbin /stack:1048576 httpd.exe
  • And don't forgot to PUT ADMINISTRATOR RIGHT on the httpd.exe file + exit WANP . (I lost a morning because of this !, editbin was returning a LINK error !!)

-> It s strange because after to have done this, I had WSDL uncaught errors but since few hours I have not this kind of error, may be it s just the proxy list that I use that are able to connect correctly. ??

the error may be "well known", but it's still a good idea to quote the entire error message in the question. There may be something specific in the error message that we need to know in order to help you.

3 Answers 3

The SOAP extension does some strange things and overrides an internal PHP errorhandler. This conflicts a little with Xdebug's error overriding mechanisms. Do include the full error message though, and I can perhaps update my answer from there on.

So i just update my message with error element, is it enought or do you need other things ? if yes, could you tell me where I can find the elements you need ? thanks again 🙂 (you are the Derick posting on mentis for PHP bugs ?)

Here s the detailed error message Xdebug I get (** to hide)

( ! ) Warning: SoapClient::SoapClient(http://****?wsdl) [soapclient.soapclient]: failed to open stream: Une tentative de connexion a �chou� car le parti connect� n�a pas r�pondu convenablement au-del� d�une certaine dur�e ou une connexion �tablie a �chou� car l�h�te de connexion n�a pas r�pondu. in D:\Programmes\wamp\www\****.php on line 146 Call Stack # Time Memory Function Location 1 0.0013 497672 ( ) ..\script gepir3-1.php:0 2 0.6920 695896 SoapClient->SoapClient( ) ..\script gepir3-1.php:146 ( ! ) Warning: SoapClient::SoapClient() [soapclient.soapclient]: I/O warning : failed to load external entity "http://****?wsdl" in D:\Programmes\wamp\www\****.php on line 146 Call Stack # Time Memory Function Location 1 0.0013 497672 ( ) ..\script gepir3-1.php:0 2 0.6920 695896 SoapClient->SoapClient( ) ..\script gepir3-1.php:146 ( ! ) Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://*****.asmx?wsdl' : failed to load external entity "http://****asmx?wsdl" in D:\Programmes\wamp\www\****.php on line 146 Call Stack # Time Memory Function Location 1 0.0013 497672 ( ) ..\script gepir3-1.php:0 2 0.6920 695896 SoapClient->SoapClient( ) ..\script gepir3-1.php:146 

And i don't understand why my php.ini contains this parameter turned to off (the autostart is missing too

; XDEBUG Extension zend_extension = "D:/Programmes/wamp/bin/php/php5.3.13/zend_ext/php_xdebug-2.2.0-5.3-vc9.dll" [xdebug] xdebug.remote_enable = off xdebug.profiler_enable = off xdebug.profiler_enable_trigger = off xdebug.profiler_output_name = cachegrind.out.%t.%p xdebug.profiler_output_dir = "D:/Programmes/wamp/tmp" 

Источник

PHP Fatal error: SOAP-ERROR: Parsing WSDL

I try to send SMS using Soap to my users when I use my SMS class in other classes SMS send currently but in one of my class it doesn't work! My SMS class :

class SendSMS < private $client; private $property; private $settings; function __construct() < ini_set("soap.wsdl_cache_enabled", "0"); $this->settings = Setting::options(); > public function _SetClient()< $this->client = new SoapClient("http://87.107.121.52/post/send.asmx?wsdl"); > public function _SetSmsProperties(array $property)< $this->property = $property; > public function _StartSending() < $logs = array(); foreach ($this->property as $sms)< $logs[] = $this->Send($sms['number'],$sms['message'],null,false); > file_put_contents(ABSPATH . rand(0001,9999) . '-smslog.txt', implode("\n",$logs) ,FILE_APPEND); > public function Send($number, $msg, $sender = null,$service = false) < $this->client = new SoapClient("http://87.107.121.52/post/send.asmx?wsdl"); ini_set("soap.wsdl_cache_enabled", "0"); $numbers = array(); if(!is_array($number)) < $numbers[] = $number; >else < $numbers = $number; >// New Edition if(!is_null($sender)) < $from = $sender; >elseif($service == true) < $from = '50008'; >else < $from = $this->settings['sms_line']; > $sendsms_parameters = array( 'username' => $this->settings['sms_username'], 'password' => $this->settings['sms_password'], 'from' => $from, 'to' => $numbers, 'text' => iconv("UTF-8", 'UTF-8//TRANSLIT',$msg), 'isflash' => false, 'udh' => "", 'recId' => array(0), 'status' => 0 ); $status = $this->client->SendSms($sendsms_parameters)->SendSmsResult; //echo $status; if($status == 1) < return true; >return false; > 
class test < public function send() < $property = array(); $property[] = array( 'number' =>'XXXXXXXX', 'message' => 'Hello User', ); $sms = new SendSMS(); $sms->_SetClient(); $sms->_SetSmsProperties($property); var_dump($sms->_StartSending()); > > 

Источник

Вызов URL из командной строки

Что говорит curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl , если вы запускаете его в оболочке на сервере Linux?

Похоже, это может быть проблема кодировки символов. WDSL закодирован в кодировке, которую ожидает клиент SOAP?

6 ответов

Для некоторых версий php SoapClient не передает информацию HTTP-агента. Какие версии php у вас есть на сервере по сравнению с локальным WAMP?

Попробуйте явно установить пользовательский агент, используя поток контекста следующим образом:

try < $opts = array( 'http' =>array( 'user_agent' => 'PHPSoapClient' ) ); $context = stream_context_create($opts); $wsdlUrl = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl'; $soapClientOptions = array( 'stream_context' => $context, 'cache_wsdl' => WSDL_CACHE_NONE ); $client = new SoapClient($wsdlUrl, $soapClientOptions); $checkVatParameters = array( 'countryCode' => 'DK', 'vatNumber' => '47458714' ); $result = $client->checkVat($checkVatParameters); print_r($result); > catch(Exception $e) < echo $e->getMessage(); > 

Изменить

На самом деле это некоторые проблемы с используемым веб-сервисом. Комбинация HTTP по протоколу IPv6 и отсутствующая строка HTTP User Agent, кажется, создает проблемы веб-службы.

Чтобы проверить это, попробуйте выполнить следующее на хосте linux:

curl -A '' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 

этот запрос IPv6 завершается с ошибкой.

curl -A 'cURL User Agent' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 

этот запрос IPv6 успешно завершен.

curl -A '' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl curl -A 'cURL User Agent' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 

оба этих запроса IPv4 успешно завершены.

Интересный случай:) Я предполагаю, что ваш хост linux разрешает ec.europa.eu на свой IPv6-адрес и что ваша версия SoapClient по умолчанию не добавила строку пользовательского агента.

Вы говорите, что запрос IPv6 не выполняется, но не указываете, как это сделать. Если произойдет сбой с кодом состояния 503, я удалю свой ответ. Там, где я нахожусь, говорится, что не Failed to connect to 2001:bc8:3408:200::2: Network is unreachable

Это правильно, запрос не выполняется с HTTP/1.0 503 Service Unavailable . Текст ответа 503 - Erreur 503 Erreur proxy ipv6 .

Источник

Читайте также:  What is header and footer in html with example
Оцените статью