imagecreatefromjpeg 超时问题

Posted

技术标签:

【中文标题】imagecreatefromjpeg 超时问题【英文标题】:imagecreatefromjpeg timeout issue 【发布时间】:2015-01-22 19:18:08 【问题描述】:

我有一个使用 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 文件经常变化,比如一个小时一次。

【问题讨论】:

检查您的 php ini 设置是否为 allow_url_fopen,也许您不允许从 URL 打开文件。 Warning Windows versions of PHP prior to PHP 4.3.0 do not support access of remote files via this function, even if allow_url_fopen is enabled.php.net/manual/en/function.imagecreatefromjpeg.php 如果该文件在您自己的服务器上,那么对自己进行 http 请求实际上是没有意义的。 PHP 不需要通过 http 来访问文件系统。你只需要imagecreatefromjpeg('/path/on/filesystem/file.jpg') 在从远程文件创建 jpg 之前,请先将其下载到本地。 使用 HTTP 客户端库下载文件,这将允许您设置下载超时,一旦达到超时,将引发异常,您将能够对此采取行动. 【参考方案1】:

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

但是,try/catch 仅适用于Exceptions,而imagecreatefromjpeg() 会抛出警告,这是一种错误。您可以通过使用set_error_handler() 将错误转化为异常来解决这个问题! (see this *** 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 
  ...
  ...
  ...
  ...

【讨论】:

以上是关于imagecreatefromjpeg 超时问题的主要内容,如果未能解决你的问题,请参考以下文章

调用未定义的函数 imagecreatefromjpeg() 并启用 GD

PHP 为啥我调用imagecreatefromjpeg(),它说我没有定义imagecreatefromjpeg()呢?

PHP - imagecreatefromjpeg 为 <1M 图像使用 100M 内存

已安装 Gd,但“调用未定义的函数 imagecreatefromjpeg()”

调用未定义的函数 imagecreatefromjpeg() GD 已安装但无法识别

imagecreatefromjpeg($ file_name):无法打开流