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