开发者

php: simplexml exception retry

I am querying an API using SimpleXML which will occasionally fail for reasons unknown. I would like to have the script retry up to 5 times. How can I do this? I assume it has something to do with wrapping the object in a try/catch, but I'm not very experienced with this -- have tried to read the manual on exception handling but am still at a loss.

Thanks for any help :)

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

Here is the error message I am receiving:

[function.file-get开发者_运维问答-contents]: failed to open stream: HTTP request failed!


try using curl to get the content you want to parse... file_get_contents can fail without much explanation about it. also try to dont use @ (this hide you errors that can make die the application) or you can just use to code in a wrong way just because you can hide the warnings


A try .. catch block will not catch regular errors, but only Exceptions, unless you set up set_error_handler to have errors be translated to ErrorExceptions. Seeing that the problem lies in the file_get_contents something like this might be a better option (untested):

$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?

Scrap that... it's highly unlikely, since it can not be set at runtime (PHP > 4.3.4 that is).


One example way of using try ... catch you describe. This isn't really dealing with the error but it retries 5 times. I'd recommend trying to diagnose the issue causing intermittent failures.

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

You might want to throw the Exception again and catch it higher up the calling code.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜