在php中超级快速getimagesize

Sir*_*jik 40 php image http getimagesize

我试图获得数百个远程图像的图像大小(图像尺寸,宽度和高度),并且getimagesize速度太慢.

我做了一些阅读,发现最快的方法是file_get_contents从图像中读取一定数量的字节并检查二进制数据中的大小.

以前有人试过吗?我该如何检查不同的格式?有人见过这个库吗?

Dej*_*vic 91

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)";
Run Code Online (Sandbox Code Playgroud)

测试...

640 x 480(0.20859s)

加载32kb的数据对我有用.

  • 我不相信用aspx编写的php教程:PI更新了我的答案,你应该拥有你需要的一切.如果那不是那么抱歉,我不完全理解你的问题.如果要比较二进制文件,则必须将其完全加载到字符串中. (13认同)
  • 使用范围参数,我遇到了较大的PNG问题.我的最佳方法是增强API,不仅可以获取图像URL,还可以获取大小或方向. (2认同)

Tom*_*Tom 26

我已经为这种情况创建了一个PHP库,它通过下载确定文件大小所需的远程文件的绝对最小值来工作.这对于每个图像都是不同的,特别是对于JPEG,取决于文件中有多少嵌入的缩略图.

它可以在GitHub上找到:https://github.com/tommoor/fastimage

用法示例:

$image = new FastImage($uri);
list($width, $height) = $image->getSize();
echo "dimensions: " . $width . "x" . $height;
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说比PHP的getimagesize更慢:快速图像:0.079681873321533s原始getimage大小:0.023485898971558s Raeger(webarto示例):0.16773s (2认同)

Exi*_*xit 5

我一直在寻找一种更好的方法来处理这种情况,因此我使用了Internet上的一些不同功能。

总的来说,当它起作用时,最快的往往是getjpegsizeJames Relyea在PHP页面上发布getimagesizeranger功能,优于上面Dejan提供的功能。 http://php.net/manual/zh/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]
Run Code Online (Sandbox Code Playgroud)
  • ranger 在图像#3上捕获32768字节时失败,因此我将其增加到65536,它成功地捕获了大小。

但是,这是有问题的,因为两者都存在,ranger并且getjpegsize受到局限性的限制,使其使用起来不够稳定。当处理大约3MB的大JPG图像时,两者均失败,但是ranger在更改其捕获的字节数后将起作用。同样,这些替代项仅处理JPG图像,这意味着仅在JPG和getimagesize其他图像格式上才需要使用条件。

另外,请注意,第一个映像位于运行旧版本PHP 5.3.2的较旧服务器上,其他四个映像均来自现代服务器(出于兼容性,基于云的cPanel和MultiPHP已回拨至5.4.45)。

值得注意的是,基于云的服务器的性能要好得多,实际上,在云服务器上的所有4个测试中getimagesize,击败速度是最慢的。那四个人还从运行代码的同一台服务器中提取了图像,尽管帐户不同。rangerranger

这让我想知道PHP内核是否在5.4中得到了改进,或者是否考虑了Apache版本。此外,它可能取决于服务器和服务器负载的可用性。我们不要忘记网络每年都在越来越快地增长,所以也许速度问题变得不再那么重要了。

因此,最终结果和我的答案是,要完全支持所有Web图像格式,并且仍要实现超快速的图像尺寸,最好将其吸收并使用getimagesize,然后缓存图像尺寸(如果这些图像是在数据库表中多次检查)。在这种情况下,只有第一次检查会产生较大的费用,但随后的请求将比读取图像标题的任何功能最少且速度更快。

与任何缓存一样,只有在内容不变的情况下,它才能很好地工作,并且有一种方法可以检查是否发生了变化。因此,一种可能的解决方案是在检查缓存时仅检查图像URL的标题,如果不相同,则转储缓存的版本,然后使用再次进行抓取getimagesize