2011-08-05 33 views
18

Me estoy desesperando, todo lo que quiero es un simple manejo de errores cuando el servicio web SOAP de PHP no responde un mensaje de error servicio de inicio de sesión abajo. ¡Por favor, ayúdame!PHP SOAP error catching

Por el momento se sigue mostrando el error (junto con advertencias ...):

Fatal error: SOAP-ERROR: Parsing WSDL

Aquí está la secuencia de comandos:

<?php 
session_start(); 
$login="0000000000000nhfidsj"; //It is like this for testing, It will be changed to a GET 

$username = substr($login,0,13); //as password is always 13 char long 
           //(the validation is done int he javascript) 
$password = substr($login,13); 
try 
{ 
    ini_set('default_socket_timeout', 5); //So time out is 5 seconds 
    $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl"); //locally hosted 

    $array = $client->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"; 
} 
?> 
+1

Honestamente, cualquier error fatal en la extensión SOAP debe ser reportado como un error ya que no hay ningún caso en el que su código cause un error fatal. 404 WSDL debe ser un SoapFault como usted espera. – ColinM

Respuesta

18

Fatal error: SOAP-ERROR: Parsing WSDL significa que el WSDL está mal y tal vez ¿desaparecido? así que no está relacionado con el jabón. Y no puedes manejar FATAL ERROR con un try catch. Ver este enlace: http://ru2.php.net/set_error_handler#35622

¿Qué obtienes cuando intentas acceder al http://192.168.0.142:8080/services/Logon?wsdl en tu navegador?

se puede comprobar si el WSDL está presente como esto

$handle = curl_init($url); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); 

$response = curl_exec($handle); 
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); 
if($httpCode == 404) { 
    /* You don't have a WSDL Service is down. exit the function */ 
} 

curl_close($handle); 

/* Do your stuff with SOAP here. */ 
+0

Oye, para la respuesta, recibo una respuesta basada en el nombre de usuario y la contraseña que le doy, pero tengo que mostrar un error si el servidor está inactivo, que es (ya que he desconectado mi conexión de red). .y obtengo ese error fatal. – David

+0

He editado mi respuesta, debes probar si la URL es válida. y hacer lo del jabón – yokoloko

+0

Tnk u, se ve como lo que estoy buscando, simplemente no funciona xD y desafortunadamente no tengo ninguna experiencia con PHP cURL – David

2

Tal vez una mejor alternativa:

set_error_handler('my_error_handler'); 
set_exception_handler('my_exception_handler'); 

function my_exception_handler($e) { 
    exit('Error, something went terribly wrong: '.$e); 
} 

function my_error_handler($no,$str,$file,$line) { 
    $e = new ErrorException($str,$no,0,$file,$line); 
    my_exception_handler($e); 
} 

donde puede ajustar los mensajes de error en las funciones mencionadas. Lo uso para devolver un mensaje en la misma situación en que lo hace, ya que puede ocurrir en cualquier momento.

Supongamos que envía un mensaje de confirmación después del inicio de sesión inicial, y esa respuesta nunca llega o llega solo parcialmente, de esta manera puede devolver un mensaje sin ningún script de ruta, nombre y número de línea. En tales casos, no devuelvo $ e en absoluto, sino que acabo de generar algo así como: 'Algo salió mal, inténtelo de nuevo (más adelante)'.

3

Desafortunadamente SOAP arroja un error fatal cuando el servicio está inactivo/inaccesible en lugar de devolver un objeto SoapFault.

Dicho esto, puede configurarlo para lanzar una excepción. Es probable que omite la parte en la que está configurando las excepciones opción soap_client en false

$client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array(
    'exceptions' => false, // change to true so it will throw an exception 
)); 

captura la excepción cuando el servicio se ha reducido:

try { 
    $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array(
    'exceptions' => true, 
)); 
} 
catch (Exception $e) 
{ 
    echo 'sorry... our service is down'; 
} 
-6

SoapFault no se extiende Excepción, atrapar a los trabajos de tipo ESPECÍFICOS :

try { 
    $client = new SoapClient("http://192.168.0.142:8080/services/Logon?wsdl",array(
    'exceptions' => true, 
)); 
} 
catch (SoapFault $e) 
{ 
    echo 'sorry... our service is down'; 
} 
+3

¡EXISTE Excepción! – Sven

17

mientras que encender las excepciones que se mencionan en el comentario anterior es un buen paso para el manejo de errores de análisis, no es suficiente por sí mismo como SOAP se puede FA tal error al usar las funciones nativas de php.

Así que primero hay que girar en el manejo de excepciones:

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'; 
} 

Y entonces también necesidad de suprimir en silencio "errores de PHP" que se originan a partir de SOAP utilizando un controlador de errores personalizado:

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 
    } 
} 

Ahora lo encontrará ahora en su lugar dispara una excepción SoapFault con el mensaje correcto "Error de jabón: SOAP-ERROR: análisis de WSDL: no se pudo cargar desde '...'" y por lo tanto, termina de nuevo en su instrucción catch capaz de manejar el error de manera más efectiva.

+0

''exceptions' => true' es el predeterminado (en mi sistema, de todos modos). –

+0

Intenté set_error_handler, ob_start o register_shutdown_function y nada podría detectar este error en realidad (Windows php 7) excepto el php_errors.log :-( –