ugrás a tartalomhoz

PHP beépített SOAP kliense vs. hibakezelés

Max Logan · 2009. Nov. 11. (Sze), 16.14
Adott egy régebben megírt SOAP kliens osztály, mely a nuSOAP megoldásra épül. Ezzel elég jól megoldottam a hibakezelést. Most gondoltam, hogy átírom a PHP beépített SOAP megoldására a cuccot, de nem igazán látom, hogy hogyan tudnám lekezelni pl. azt az esettet, amikor a SOAP kiszolgáló nem érhető el. Ilyen esetben dob egy kellemes WARNING-ot, azt' csókolom.

Ötlet?
 
1

Fatal error

Max Logan · 2009. Nov. 11. (Sze), 16.29
Azt elfelejtettem, hogy nem is a WARNING a zavaró, hanem az, hogy dob egy fatal error-t is, így meg vagyok lőve.
2

exceptions beállítás

ThomasEdison · 2009. Nov. 11. (Sze), 18.04
Próbáltad az exceptions beállítást true-val?
Az Options paraméternél:
The exceptions option is a boolean value defining whether soap errors throw exceptions of type SoapFault.
SoapClient::SoapClient
3

try..catch

gphilip · 2009. Nov. 11. (Sze), 19.23
Mondjuk ha már PHP5 megoldást használsz (nuSoap->Soap), akkor miért ne használnád a try..catch vezérlési szereketet, hogy elkapd a SoapFault nevű kivételt (extends Exception)?
4

Re

Max Logan · 2009. Nov. 11. (Sze), 22.55
Nos, a kivételkezeléssel eddig még nem sikerült megbarátkoznom és nem most akarok nekiállni (ha lesz egy kis ráérő időm és humorom, akkor mégegyszer nekifutok).

Próbáltam már mindenféle megoldásban. Én úgy értelmezem, hogy a SoapFault az csak akkor jön képbe, amikor a függvényhívás közben adódik valami gond.

Ezt tűnik alátámasztani az is, hogy ha egy nem létező WSDL címet adok meg, akkor jelzi egy warning-gal, hogy nem található és nem ugrik át a catch ágba. Az itthoni fejlesztőkörnyezetben fatal error-t dob a 60 mp-es futásidő limitre hivatkozva, a munkahelyi gépen meg más hibát dobott, de ott is fatal error volt.

A fentiekből kiindulva az exceptions paraméter csak a call hibákra vonatkozik.


UpDate: ha az exceptions-nek 0-t adok, akkor valóban nem dob kivételt és az is_soap_fault függvénnyel el tudom kapni, hogy hiba van. De ez a hibakezelési eljárás csak a függvény hívásra vonatkozik.

Jobban mondva, ha local WSDL elérhetőséget adok meg (pl. aaa.wsdl), akkor működik a Try-Catch. Ha távoli címet, akkor valamiért nem működik, a SoapClient dob fatal error-t, hogy nem tudta beolvasni a WSDL-t ezért nem is tudta értelmezni azt.

UpDate 2: Egyre árnyaltabb a kép. Ha olyan IP-t adok meg WSDL címnek, ami létezik csak éppen ott nincsen WSDL (pl. az én ADSL IP-m, ami a router-emre mutat (kap is a PHP 401-et), vagy a céges szerver IP-je), akkor működik a kivételkezelés.

UpDate 3: Ha beállítom a connection_timeout paramétert és megadok egy hasraütött IP-t, akkor nem dobja el a műveletet, hanem megvárja míg lejár a megadott max. futásidő. Ezt nem igazán értem. Pedig ha ez a paraméter működne, akkor valóban működik a SoapFault a teljes hibakezelésre és akkor no para.

Összefoglalnám, hogy eddig hogyan állok:
  1. try-catch működik, ha local címet adok meg (azaz nincsen http:// előtag)
  2. try-catch működik, ha létező távoli címet adok meg (van http:// előtag), de ott nincsen WSDL
  3. try-catch nem műküdik, ha nem létező távoli címet adok meg (connection_timeout paraméter nem akar működini, a script megvárja a maximális futásidő végét is kiakad)
Pedig ez utóbbi lenne a lényeg, mert főként azt akarnám lekezelni (és logolni), hogy nem volt elérhető a távoli webservice, amikor a rendszer próbálta volna elérni.

UpDate 4: Időközben kiderült, hogy a connection_timeout nem megfelelő működése bejelentett bug. Ott a kommentekben az ajánlják, hogy operáljuk a default_socket_timeout beállítással a hibakezés során (csökkentés a kapcsolódás előtt, majd ha sikerült, akkor vissza az eredeti értékre). Amíg nem javítják a hibát, addig működőképes megoldás a kapcsolódási hiba észlelésére.

A bug PHP 5.2.9-re lett bejelentve (én is ezen észleltem), de nálam egy teszt 5.3.0-s rendszeren is jelen van. Mivel nyitott a bugreport valószínű még nem javították.