PHP Sabun aşımları Taşıma

6 Cevap php

Ben bir SOAP web hizmeti ile kullanıcı bilgileri doğruladıktan bir proje üzerinde çalışıyorum. Ben şu anda web hizmetinden tepkiler alıyorum varsayarak hataları bakımı değil, aynı zamanda bir hizmet zaman aşımı veya kullanılamaması kenar davalarını ihtiyaç duyuyorum.

Bir zaman aşımı veya hizmet kullanılamaması durumunda, ben istek (web hizmeti bilgi onaylanmış olduğunu) başarılı olduğunu iddia etmek gerekiyor, ama ben özel durum ne net değilim.

Bazı sözde kodu:

// $client is PHP's SoapClient class
try {
  $response = $client->SomeSoapRequest();
}
catch(SoapFault $e){
  // handle issues returned by the web service
}
catch(Exception $e){
  // handle PHP issues with the request
}

Ne bulmak gibi olamaz:

  1. Zaman aşımları bir SoapFault mısınız? Eğer öyleyse, ne zaman aşımı hata ve (bir tür hata, vb) web hizmeti sorunları ayırt etmek için en iyi yolu nedir? Ben mesajı "Hata üstbilgileri yükleme" etkisi bir şey oldu bir hata sözü bir sayfa buldum, ama bu sabun arıza oldu söz etmedi.
  2. Nasıl bir hizmet dışı kalması potansiyel ne olacak? O (olmaması bir yuva sorunu veya benzer olacaktır nerede SoapFault web hizmetinden iade edileceği) mantıklı olur gibi bir PHP özel görünüyor?
  3. Bir zaman aşımı karşı test edebilirsiniz varolan bir servis (örneğin örnek) var mı? Çoğu zaman aşımı ile ilgili tartışmalar bu durumda ideal değil varsayılan zaman aşımı ayarı genişleterek zaman aşımları önlenmesi için ilgili görünmektedir.

Teşekkürler!

6 Cevap

1) In case of timeout, PHP throws a SoapFault exception with faultcode="HTTP" and faultstring="Error Fetching http headers".

2) In my opinion, the best way to distinguish between a timeout error and web service issues is by looking at the faultcode and faultstring members of the SoapFault class.
In particular, the faultcode element is intended for use by software to provide an algorithmic mechanism for identifying the fault.
As you can also read in a comment of the PHP manual, there is no method to read the faultcode property, so you have to access it directly (eg. $e->faultcode), because the getCode() method does not work.
The SOAP 1.1 Spec defines four possible values for the faultcode field:

  • VersionMismatch: işleme taraf SOAP Zarf elemanı için geçersiz bir ad buldu
  • MustUnderstand: işleme tarafın itaat anlaşılmamış ya da değil ya da SOAP Header elemana bir acil alt öğesi bir soap "1" değeri ile nitelik mustUnderstand içeriyordu
  • Client: hataları İşveren sınıfı iletisi yanlış kuruldu ya da başarılı olmak için gerekli bilgileri içeren olmadığını göstermektedir. Örneğin, mesaj uygun kimlik veya ödeme bilgi eksikliği olabilir. Genel olarak mesaj değişiklik olmadan yeniden gönderilmesini olmamalıdır bir göstergesidir.
  • Server: hataları sunucu sınıfı mesajı mesajın kendisi değil, mesajın işleme içeriğine doğrudan ilişkili olmayan nedenlerle işlenen olamayacağını göstermektedir. Örneğin, işleme yanıt vermedi, bir yukarı akış işlemcisi, iletişim içerebilir. Mesajı zaman içinde daha sonraki bir noktada başarılı olabilir.

In addiction to those codes, PHP uses the HTTP code for identifying the errors happening at the protocol level (eg.: socket errors); for example, if you search for add_soap_fault in the ext/soap/php_http.c source code you can see when some of these kind of faults are generated.
By searching for the add_soap_fault and soap_server_fault functions in the PHP SOAP extension source files, I've built the following list of PHP SoapFault exceptions:

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) zaman aşımı durumu taklit etmek için, aşağıdaki kodu deneyin:

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();

?>

Notice the sleep call in the SoapServer.php script with a time (20) longest than the time (10) specified for the default_socket_timeout parameter in the SoapClient.php script.
If you want to simulate a service unavailability, you could for example change the location protocol from http to https in the soapclient.php script, assuming that your web server is not configured for SSL; by doing this, PHP should throw a "Could not connect to host" SoapFault.

$e->getMessage "Hata getirilirken http başlıkları" ise, benim deneyim, bir ağ zaman aşımı ile ilgileniyor.

$e->getMessage "ana bilgisayara bağlanmak olamaz" gibi bir şey ise, ulaşmaya çalıştığınız hizmet aşağı.

Bir farklı şeyler ifade edebilir daha şifreli, daha sonra orada "Biz hiçbir XML belgesi var gibi görünüyor."

Zaman aşımları hizmetinde başa

$client = new SoapClient($wsdl, array("connection_timeout"=>10));

// SET SOCKET TIMEOUT
if(defined('RESPONSE_TIMEOUT') &&  RESPONSE_TIMEOUT != '') {
 ini_set('default_socket_timeout', RESPONSE_TIMEOUT);
}

Ben güzel bir istisna benim SoapClient uzatım almak için iki faktör kullanılır. Mesajı ve zamanı talebi geri aldı. Ben hata mesajı "http başlıklarını getiriliyor Hata" da, diğer bazı durumlarda, bu nedenle zaman kontrol occure düşünüyorum.

Aşağıdaki kod hakkında doğru olmalı

class SoapClientWithTimeout extends SoapClient {
    public function __soapCall ($params, ---) {
        $time_start = microtime(true);
        try {
            $result = parent::__soapCall ($params, ---);
        }
        catch (Exception $e) {
            $time_request = (microtime(true)-$time_start);
            if(
                $e->getMessage() == 'Error Fetching http headers' &&
                ini_get('default_socket_timeout') < $time_request
            ) {
                throw new SoapTimeoutException(
                    'Soap request most likly timed out.'.
                    ' It took '.$time_request.
                    ' and the limit is '.ini_get('default_socket_timeout')
                );
            }

            // E: Not a timeout, let's rethrow the original exception
            throw $e;
        }

        // All good, no exception from the service or PHP
        return $result;
    }
}

class SoapTimeoutException extends Exception {}

Sonra SoapClientWithTimeout kullanın

$client = new SoapClientWithTimeout();
try {
    $response = $client->SomeSoapRequest();
    var_dump($response);
}
catch(SoapTimeoutException $e){
    echo 'We experienced a timeout! '. $e->getMessage();
}
catch(Exception $e) {
    echo 'Exception: '.$e->getMessage();
}

Servis zamanlamayı hata ayıklamak için. Servisi çağırmadan önce aşağıdaki satırı ekleyin

ini_set('default_socket_timeout', 1);

Ben biraz geciktim Guess, ama durumda birisi hala php soap istemci zaman aşımı için çözüm arıyor - burada benim için çalıştı buydu: http://www.darqbyte.com/2009/10/21/timing-out-php-soap-calls/

Temelde set zaman aşımı ile cURL PHP SoapClient değiştirilmesi. Sadece bazen WS HTTP başlığında belirtilen eylem bekliyor, unutmayın. Bu web sitesinde yayınlanan özgün çözüm (yorumları kontrol) o içermez.