超快速getimagesize在PHP中
我正在尝试获取数百个远程图像的图像大小(图像尺寸,宽度和高度), getimagesize
太慢了。
我已经做了一些阅读,发现最快的方法是使用file_get_contents
从图像中读取一定数量的字节并检查二进制数据中的大小。
有人试过这个吗? 我将如何检查不同的格式? 任何人都看到这个图书馆?
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.comhttp://img.dovov.comnews2/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)";
testing…
640 x 480(0.20859秒)
加载32kb的数据为我工作。
我已经为此场景创build了一个PHP库,它通过下载确定文件大小所需的远程文件的绝对最小值来工作。 这对每个图像都是不同的 ,特别是JPEG取决于文件中有多lessembedded的缩略图。
它可以在这里的GitHub: https : //github.com/tommoor/fastimage
用法示例:
$image = new FastImage($uri); list($width, $height) = $image->getSize(); echo "dimensions: " . $width . "x" . $height;
我正在寻找更好的方法来处理这种情况,所以我使用了在互联网上发现的几个不同的function。
总的来说,当它工作的时候,最快的趋势往往是James Relyea在PHP页面上为getimagesize
发布的getjpegsize
函数,击败了上面提到的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]
- 当在图像#3上抓取32768字节时,
ranger
失败,所以我把它增加到65536,并且它成功地抓住了大小。
虽然有问题,但是ranger
和getjpegsize
的使用方式不够稳定。 在处理大约3MB左右的大JPG图片时都失败了,但是ranger
在更改抓取的字节数量之后会工作。 此外,这些替代品只处理JPG图像,这意味着需要使用条件才能在JPG上使用它们,而在其他图像格式上使用getimagesize
。
另外,请注意,第一个映像位于运行旧版本PHP 5.3.2的较旧版本服务器上,其中另外4个映像来自现代服务器(基于云的cPanel,MultiPHP为了兼容性而拨回到5.4.45)。
值得注意的是,基于云的服务器在getimagesize
performance要好得多,实际上在云服务器上的所有4个testing中, ranger
是最慢的。 这些4也是从代码运行的同一台服务器上拉出的图像,虽然是不同的帐户。
这让我怀疑5.4版本的PHP核心是否有所改进,或者Apache的版本是否有影响。另外,这可能是服务器和服务器负载的可用性。 我们不要忘记,networking每年的速度越来越快,所以也许速度问题变得不那么重要了。
所以,最终的结果和我的答案是,为了完全支持所有的网页图像格式,并且仍然实现超快的图像尺寸,最好把它吸起来,使用getimagesize
,然后caching图像大小(如果这些图像不止一次检查)在数据库表中。 在这种情况下,只有第一次检查会导致更大的成本,但后续的请求将比读取图像头的任何函数都小,速度更快。
和任何caching一样,如果内容没有改变,那么它就会工作得很好,并且有办法检查是否有变化。 因此,可能的解决scheme是在检查caching时只检查图像URL的标题,如果不同,请转储caching的版本并使用getimagesize
再次抓取。