我正在尝试获取数百张远程图像的图像尺寸(图像尺寸,宽度和高度),getimagesize
太慢了。
我做了一些阅读,发现最快的方法是使用file_get_contents
从图像中读取一定数量的字节并检查二进制数据中的大小。
之前有人试过吗?我该如何检查不同的格式?有人见过这个库吗?
答案 0 :(得分:90)
function ranger($url){
$headers = array(
"Range: bytes=0-32768"
);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
$start = microtime(true);
$url = "http://news.softpedia.com/images/news2/Debian-Turns-15-2.jpeg";
$raw = ranger($url);
$im = imagecreatefromstring($raw);
$width = imagesx($im);
$height = imagesy($im);
$stop = round(microtime(true) - $start, 5);
echo $width." x ".$height." ({$stop}s)";
...测试
640 x 480(0.20859s)
加载32kb的数据为我工作。
答案 1 :(得分:25)
我已经为这种情况创建了一个PHP库,它通过下载确定文件大小所需的远程文件的绝对最小值来工作。这对于每个图像都是不同的,特别是对于JPEG,取决于文件中有多少嵌入的缩略图。
可在GitHub上找到:https://github.com/tommoor/fastimage
使用示例:
$image = new FastImage($uri);
list($width, $height) = $image->getSize();
echo "dimensions: " . $width . "x" . $height;
答案 2 :(得分:4)
我一直在寻找一种更好的方法来处理这种情况,所以我在互联网上找到了一些不同的功能。
总的来说,当它工作时,最快的往往是James Relyea在getjpegsize
的PHP页面上发布的getimagesize
函数,击败了上面Dejan提供的ranger
函数。
http://php.net/manual/en/function.getimagesize.php#88793
Image #1 (787KB JPG on external older server)
getimagesize: 0.47042 to 0.47627 - 1700x2340 [SLOWEST]
getjpegsize: 0.11988 to 0.14854 - 1700x2340 [FASTEST]
ranger: 0.1917 to 0.22869 - 1700x2340
Image #2 (3MB PNG)
getimagesize: 0.01436 to 0.01451 - 1508x1780 [FASTEST]
getjpegsize: - failed
ranger: - failed
Image #3 (2.7MB JPG)
getimagesize: 0.00855 to 0.04806 - 3264x2448 [FASTEST]
getjpegsize: - failed
ranger: 0.06222 to 0.06297 - 3264x2448 * [SLOWEST]
Image #4 (1MB JPG)
getimagesize: 0.00245 to 0.00261 - 2031x1434
getjpegsize: 0.00135 to 0.00142 - 2031x1434 [FASTEST]
ranger: 0.0168 to 0.01702 - 2031x1434 [SLOWEST]
Image #5 (316KB JPG)
getimagesize: 0.00152 to 0.00162 - 1280x720
getjpegsize: 0.00092 to 0.00106 - 1280x720 [FASTEST]
ranger: 0.00651 to 0.00674 - 1280x720 [SLOWEST]
ranger
失败,因此我将其增加到65536并成功抓住了这个尺寸。但是存在问题,因为ranger
和getjpegsize
的限制方式使其不够稳定而无法使用。在处理大约3MB的大型JPG图像时,两者都失败了,但ranger
在更改其抓取的字节数后将起作用。此外,这些替代品仅处理JPG图像,这意味着需要使用条件仅在JPG上使用它们,而在其他图像格式上使用getimagesize
。
另外,请注意第一张图片位于运行旧版本PHP 5.3.2的旧服务器上,其他4张图像来自现代服务器(基于云的cPanel,MultiPHP拨回5.4.45以获得兼容性)。
值得注意的是,基于云的服务器在getimagesize
的情况下表现更好,超过了ranger
,事实上对于云服务器上的所有4个测试,ranger
是最慢的。这些4也是在代码运行时从同一服务器中提取图像,但不同的帐户。
这让我想知道PHP内核是否在5.4中得到了改进,或者Apache版本因素是否因此而受到影响。此外,它可能会降低服务器和服务器负载的可用性。让我们不要忘记每年网络变得越来越快,所以速度问题可能不再是一个问题。
所以,最终结果和我的答案是,为了完全支持所有Web图像格式,并且仍然可以实现超快的图像大小,最好将其吸取并使用getimagesize
然后缓存数据库表中的图像大小(如果这些图像将被多次检查)。在这种情况下,只有第一次检查会产生更大的成本,但后续请求将比读取图像标题的任何函数更小,更快。
与任何缓存一样,只有在内容没有变化并且有办法检查是否有变化时,它才能正常工作。因此,一种可能的解决方案是在检查缓存时仅检查图像URL的标头,如果不同,则转储缓存版本并使用getimagesize
再次抓取它。