1) w przypadku przekroczenia limitu czasu, PHP zgłosi wyjątek SoapFault z faultcode="HTTP"
i faultstring="Error Fetching http headers"
.
2) Moim zdaniem, najlepszym sposobem na rozróżnienie między błędem przekroczenia limitu czasu a usługami sieciowymi jest patrzenie na użytkowników faultcode
i faultstring
członków SoapFault class.
W szczególności element faultcode
jest przeznaczony do użytku przez oprogramowanie w celu zapewnienia algorytmu do identyfikacji błędu.
Jak można również przeczytać w comment of the PHP manual, nie istnieje metoda odczytu właściwości faultcode
, więc trzeba uzyskać do niej bezpośredni dostęp (np. $e->faultcode
), ponieważ metoda getCode()
nie działa.
SOAP 1.1 Spec definiuje cztery możliwe wartości dla pola faultcode
:
- VersionMismatch: Partia przetwarzanie znaleziono nieprawidłowy nazw dla elementu SOAP Envelope
- MustUnderstand: natychmiastowy element podrzędny mydła Element nagłówka, który nie został zrozumiany lub nie został spełniony przez stronę przetwarzającą, zawierał atrybut SOAP mustUnderstand o wartości "1"
- Klient: Klasa błędów klienta wskazuje, że wiadomość została utworzona nieprawidłowo lub nie zawierała odpowiednich informacji, aby odnieść sukces. Na przykład w wiadomości może brakować prawidłowego uwierzytelnienia lub informacji o płatności. Zasadniczo jest to wskazówka, że wiadomość nie powinna być ponownie wysłana bez zmian.
- Serwer: Klasa błędów serwera wskazuje, że wiadomość nie mogła zostać przetworzona z przyczyn niezwiązanych bezpośrednio z treścią wiadomości, a raczej z przetwarzaniem wiadomości. Na przykład przetwarzanie może obejmować komunikację z wyższym procesorem, który nie odpowiedział. Wiadomość może się powieść w późniejszym czasie.
Oprócz tych kodów, PHP wykorzystuje kod HTTP
do identyfikacji błędów występujących na poziomie protokołu (np .: błędy gniazd); na przykład, jeśli szukasz add_soap_fault
w kodzie źródłowym ext/soap/php_http.c, możesz zobaczyć, kiedy generowane są niektóre z tych błędów.
wyszukując add_soap_fault
i soap_server_fault
funkcji w plikach źródłowych PHP rozszerzeń SOAP, mam wbudowany poniższej listy PHP SoapFault
wyjątkami:
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) Aby symulować stan limitu czasu, spróbuj następujących Kod:
soapclient.php
<?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)."</pre>\n";
//echo "<pre>faultcode: '".$e->faultcode."'</pre>";
//echo "<pre>faultstring: '".$e->getMessage()."'</pre>";
}
?>
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();
?>
Wskazówka wywołanie sleep
w skrypcie SoapServer.php
z czasem (20) Najdłuższy niż raz (10) określona dla parametru w skrypcie SoapClient.php
default_socket_timeout
.
Jeśli chcesz zasymulować niedostępność usługi, możesz na przykład zmienić protokół location
z http
na https
w skrypcie soapclient.php
, zakładając, że Twój serwer internetowy nie jest skonfigurowany pod kątem protokołu SSL; w ten sposób PHP powinno rzucić "Nie można połączyć się z hostem" SoapFault.
kiedyś naprawić? –
Niezupełnie. Muszę jeszcze spróbować rozwiązania Roberta Ludwicka, ale wydaje mi się, że najbardziej zbliżam się do tego, czego potrzebuję. Jeśli okaże się, że to rozwiązanie działa (lub robi to inaczej), proszę dać mi znać! – Rob
Wciąż brak poprawki? :-( – Chris