php: SimpleXML istisna deneme

3 Cevap php

Bazen bilinmeyen nedenlerle başarısız olur SimpleXML kullanarak bir API sorgulama ediyorum. Ben komut dosyası 5 kez yeniden denemek istiyorum. Bunu nasıl yapabilirim? Ben bir try / catch nesneyi kaplamak ile ilgisi var varsayalım, ama ben çok bu deneyimli değilim - istisna işleme üzerine kılavuzunu okumak ama bir kayıp hala duyuyorum çalıştık.

Herhangi bir yardım için teşekkür ederiz :)

// set up xml handler
$xmlstr = file_get_contents($request);
$xml = new SimpleXMLElement($xmlstr);

İşte ben alıyorum hata iletisi:

[Function.file-olsun-içindekiler]: failed to open stream: HTTP isteği başarısız oldu!

3 Cevap

ayrıştırmak istediğiniz içeriği almak için curl kullanmayı deneyin ... file_get_contents bu konuda çok fazla açıklama olmadan başarısız olabilir. Ayrıca kullanım @ dont deneyin (bu sakla uygulamayı ölmek yapabilir hataları) veya uyarılarını gizleyebilirsiniz sadece çünkü sadece bir yanlış şekilde kod kullanabilirsiniz

A try .. catch blok düzenli hataları yakalamak değil, ancak kurmak sürece sadece Exception s set_error_handler hataları ErrorException için tercüme etmiş . s böyle Seeing that the problem lies in the file_get_contents şey (denenmemiş) daha iyi bir seçenek olabilir:

$maxTries = 5;
do
{
  // supress the error with @ (or log it) and probe the output in while condition
  $content = @file_get_content( $someUrl );
}
while( false === $content && --$maxTries );

if( false !== $content )
{
   try
   {
      // SimpleXMLElement *will* throw an exception in case of malformed xml
      $xml = new SimpleXMLElement( $content );
   }
   catch( Exception $exception )
   {
      /* handle exception */
   }
}
else
{
    /* handle file_get_contents failure */
}

However, since you are trying to read from a http url, I presume the failure has something to do with the ini setting on whether url requests are allowed for opening files. See the docs on allow_url_fopen . Is something/someone altering this setting now and then perhaps?

Zamanında ayarlanamaz beri ... o (PHP> 4.3.4 olduğunu), son derece düşüktür hurda.

Kullanmanın bir örneği yolu try ... catch size tarif. Bu gerçekten hata ile ilgili değil ama 5 kez dener. Ben aralıklı hatalarına neden sorunu teşhis etmek için çalışıyorum tavsiye ederim.

class MyClass {

    protected $xml;

    public function readAPI() {

        ...
        $loaded = false;
        $fetch = 5;

        while (!$loaded && $fetch) {
            $loaded = $this->_loadXML($request);
            $fetch--;
        }

    }

    protected function _loadXML($request) {

        $result = true;

        try {
            $xmlStr = file_get_contents($request);
            $this->xml = new SimpleXMLElement($xmlStr);
        } catch (Exception $e) {
            $result = false;
        }

        return $result;
    }
}

Yine İstisna atmak ve daha yüksek arama kodu kadar onu yakalamak isteyebilirsiniz.