imagecreatefromjpeg超时问题

时间:2015-01-22 19:18:08

标签: php image jpeg gd connection-timeout

我有一个使用imagecreatefromjpeg()的长函数。

function myFunction() {
  ...
  ...       
  $im = imagecreatetruecolor(600, 400);
  $myImage = imagecreatefromjpeg("http://example.com/file.jpeg");
  imagecopy($im, $myImage , 5, 5, 0, 0, 48, 48);
  ...
  ...
  ...
  ...
  }

我从远程URL加载jpeg文件。因此,由于服务器负载,我得到:

Warning: Warning (2): imagecreatefromjpeg(http://example.com/file.jpeg): 
 failed to open stream: Connection timed out in 
 [/var/www/vhosts/example2.com/httpdocs/myfile.php, line 1851]

此文件花费了所有执行时间,因此请求对我的其余功能

失败

虽然我需要下载最新的jpeg文件,但我可以接受运行剩余的代码。

我寻找这样的解决方案:
- 试试这个:从jpeg文件创建图像
- 如果5秒后未成功,请跳过
- 运行剩余代码。

编辑:
- 偶尔会出现这个错误。大多数请求成功。所以allow_url_fopen不是问题 - 这个jpeg文件经常变化,就像每小时一次。

1 个答案:

答案 0 :(得分:1)

在一段代码可能无法正常工作的情况下,无论是由于错误还是异常,您都可以使用try / catch语句来处理该问题。这样,如果您的代码因任何原因而中断或不起作用,您可以编写一种方法来处理给定的错误或异常。

但是,try / catch仅适用于Exceptions,而imagecreatefromjpeg()会发出警告,这是一种错误。您可以使用set_error_handler()将错误转换为例外来解决此问题! (see this StackOverflow thread for more info

在php文件的顶部插入

set_error_handler(function($errno, $errstr, $errfile, $errline, array, $errcontext) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

在您的功能中,您可以执行以下操作:

function myFunction() {
  ...
  ...
  try{ 
    $im = imagecreatetruecolor(600, 400);
    $myImage = imagecreatefromjpeg("http://example.com/file.jpeg");
    imagecopy($im, $myImage , 5, 5, 0, 0, 48, 48);
  } catch (ErrorException $ex){
    // Do Nothing
    // Or Handle the error somehow
  }
  // Code continues to run 
  ...
  ...
  ...
  ...
}