我有一个使用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文件经常变化,就像每小时一次。
答案 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
...
...
...
...
}