1) В случае тайм-аута PHP генерирует исключение SoapFault с faultcode="HTTP"
и faultstring="Error Fetching http headers"
.
2) На мой взгляд, лучший способ провести различие между ошибкой тайм-аута и проблемами веб-службы - это посмотреть на faultcode
и faultstring
членов класса SoapFault .
В частности, элемент faultcode
предназначен для использования программным обеспечением для предоставления алгоритмического механизма выявления неисправности.
Как вы также можете прочитать в комментарии к руководству по PHP , нет способа прочитать свойство faultcode
, поэтому вы должны получить к нему прямой доступ (например, $e->faultcode
), потому что getCode()
метод не работает.
SOAP 1.1 Spec определяет четыре возможных значения для поля faultcode
:
- VersionMismatch : Сторона обработки обнаружила недопустимое пространство имен для элемента конверта SOAP
- MustUnderstand : Непосредственный дочерний элемент элемента заголовка SOAP, который либо не был понят, либо не подчинен обработчику, содержал атрибут SOAP mustUnderstand со значением «1»
- Клиент : класс ошибок клиента указывает, что сообщение было сформировано неправильно или не содержало соответствующей информации для успешного выполнения. Например, в сообщении может отсутствовать правильная информация для аутентификации или оплаты. Как правило, это указание на то, что сообщение не следует повторно отправлять без изменений.
- Сервер : класс ошибок сервера указывает, что сообщение не может быть обработано по причинам, не связанным непосредственно с содержанием самого сообщения, а скорее с обработкой сообщения. Например, обработка может включать связь с вышестоящим процессором, который не отвечает. Сообщение может быть успешно выполнено в более поздний момент времени.
В дополнение к этим кодам PHP использует код HTTP
для выявления ошибок, происходящих на уровне протокола (например: ошибки сокета); например, если вы ищете add_soap_fault
в исходном коде ext / soap / php_http.c , вы можете увидеть, когда генерируются некоторые из этих сбоев.
Поиском функций add_soap_fault
и soap_server_fault
в исходных файлах расширения PHP SOAP я создал следующий список исключений PHP SoapFault
:
HTTP
----
Unable to parse URL
Unknown protocol. Only http and https are allowed.
SSL support is not available in this build
Could not connect to host
Failed Sending HTTP SOAP request
Failed to create stream??
Error Fetching http headers
Error Fetching http body: No Content-Length: connection closed or chunked data
Redirection limit reached: aborting
Didn't recieve an xml document
Unknown Content-Encoding
Can't uncompress compressed response
Error build soap request
VersionMismatch
---------------
Wrong Version
Client
------
A SOAP 1.2 envelope can contain only Header and Body
A SOAP Body element cannot have non Namespace qualified attributes
A SOAP Envelope element cannot have non Namespace qualified attributes
A SOAP Header element cannot have non Namespace qualified attributes
Bad Request
Body must be present in a SOAP envelope
Can't find response data
DTD are not supported by SOAP
encodingStyle cannot be specified on the Body
encodingStyle cannot be specified on the Envelope
encodingStyle cannot be specified on the Header
Error cannot find parameter
Error could not find "location" property
Error finding "uri" property
looks like we got "Body" with several functions call
looks like we got "Body" without function call
looks like we got no XML document
looks like we got XML without "Envelope" element
Missing parameter
mustUnderstand value is not boolean
SoapClient::__doRequest() failed
SoapClient::__doRequest() returned non string value
Unknown Data Encoding Style
Unknown Error
DataEncodingUnknown
MustUnderstand
--------------
Header not understood
Server
------
Couldn't find WSDL
DTD are not supported by SOAP
Unknown SOAP version
WSDL generation is not supported yet
3) Чтобы смоделировать условие тайм-аута, попробуйте следующий код:
soapclient.php
<code><?php
ini_set('default_socket_timeout', 10);
$client = new SoapClient(null,
array(
'location' => "http://localhost/soapserver.php",
'uri' => "http://localhost/soapserver.php",
'trace' => 1
)
);
try {
echo $return = $client->__soapCall("add",array(41, 51));
} catch (SoapFault $e) {
echo "<pre>SoapFault: ".print_r($e, true)."
\ п ";
// echo "
faultcode: '".$e->faultcode."'
";
// echo "
faultstring: '".$e->getMessage()."'
";
}
?>
soapserver.php
<?php
function add($a, $b) {
return $a + $b;
}
sleep(20);
$soap = new SoapServer(null, array('uri' => 'http://localhost/soapserver.php'));
$soap->addFunction("add");
$soap->handle();
?>
Обратите внимание на вызов sleep
в сценарии SoapServer.php
с временем (20), превышающим время (10), указанное для параметра default_socket_timeout
в сценарии SoapClient.php
.
Если вы хотите смоделировать недоступность службы, вы можете, например, изменить протокол location
с http
на https
в сценарии soapclient.php
, предполагая, что ваш веб-сервер не настроен для SSL; сделав это, PHP должен выдать SoapFault «Не удалось подключиться к хосту».