Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的超快速getimagesize_Php_Image_Http_Getimagesize - Fatal编程技术网

php中的超快速getimagesize

php中的超快速getimagesize,php,image,http,getimagesize,Php,Image,Http,Getimagesize,我试图获得数百个远程图像的图像大小(图像尺寸、宽度和高度),但速度太慢了 我做了一些阅读,发现最快的方法是从图像中读取一定数量的字节,并检查二进制数据中的大小 以前有人尝试过吗?我如何检查不同的格式?有人看过这方面的图书馆吗 function ranger($url){ $headers = array( "Range: bytes=0-32768" ); $curl = curl_init($url); curl_setopt($curl, CURLO

我试图获得数百个远程图像的图像大小(图像尺寸、宽度和高度),但速度太慢了

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

以前有人尝试过吗?我如何检查不同的格式?有人看过这方面的图书馆吗

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)";
测试

640x480(0.20859s)


加载32kb的数据对我来说很有用。

我为这个场景创建了一个PHP库,它通过下载确定文件大小所需的绝对最小远程文件来工作。这对于每个图像都是不同的,尤其是对于JPEG,这取决于文件中有多少嵌入的缩略图

可在GitHub上访问:

用法示例:

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

我一直在寻找更好的方法来处理这种情况,所以我使用了互联网上的一些不同功能

总的来说,当它起作用时,最快的往往是James Relyea在PHP页面上发布的
getimagesize
函数,它击败了上面Dejan提供的
ranger
函数。

  • ranger
    在获取图像#3上的32768字节时失败,因此我将其增加到65536,它成功地获取了大小
不过也存在一些问题,因为
ranger
getjpegsize
都受到限制,无法稳定使用。在处理3MB左右的大型JPG图像时,这两种方法都失败了,但是
ranger
在更改其捕获的字节量后将工作。此外,这些替代方案仅处理JPG图像,这意味着需要使用条件来仅在JPG上使用它们,并在其他图像格式上使用
getimagesize

另外,请注意,第一个映像位于运行旧版本PHP5.3.2的旧服务器上,其他4个映像来自一个现代服务器(基于云的cPanel,带MultiHP,可拨回5.4.45以实现兼容性)

值得注意的是,基于云的服务器在使用
getimagesize
击败
ranger
时表现要好得多,事实上,在云服务器上的所有4项测试中,
ranger
是最慢的。这4个人也在代码运行时从同一台服务器上提取图像,尽管账户不同

这让我想知道PHP核心是否在5.4中得到了改进,或者Apache版本是否考虑到了这一点。此外,这可能取决于服务器的可用性和服务器负载。让我们不要忘记网络是如何每年都变得越来越快的,所以速度问题可能已经不再那么令人担忧了

因此,最终的结果和我的答案是,为了完全支持所有web图像格式,并且仍然能够实现超快的图像大小,最好将其吸收并使用
getimagesize
,然后在数据库表中缓存图像大小(如果这些图像将被多次检查)。在这种情况下,只有第一次检查会产生更大的成本,但后续的请求将比读取图像头的任何函数都要少且快


与任何缓存一样,它只有在内容没有更改并且有办法检查是否有更改时才能正常工作。因此,一种可能的解决方案是在检查缓存时只检查图像URL的标题,如果不同,则转储缓存的版本,并使用
getimagesize

再次抓取它。这可能很慢,因为图像是远程的。首先下载它们,
getimagesize()
将会非常快。毕竟,它只从图像中读取某些二进制字节。这就是为什么我想使用文件获取内容,而不是下载整个文件。2) 只读取某些字节以获取图像大小实际上我想使用fopen和fgets只读取那些二进制字节远程站点没有提供
内容长度
标题吗?如果getimagesize()我会感到惊讶下载的文件比需要的多得多。只要阅读本文,它就会解释检索文件的不同和最佳方法。第二步。如何区分不同的二进制代码以获得图像大小我不相信用aspx:P编写的php教程我更新了我的答案,你应该拥有你需要的一切。如果不是这样,那么对不起,我不完全理解你的问题。如果要将其进行二进制比较,则必须将其完全加载到字符串中。@webarto我认为他需要图像维度,图像维度将位于图像元数据中,而不是文件元数据中。他将不得不下载文件的初始字节,但究竟有多少取决于图像格式。顺便说一句,我应该指定,我在寻找图像尺寸。lemme使用范围参数时,我遇到了较大PNG的问题。在我的案例中,最好的方法是增强API,不仅可以获取图像URL,还可以获取大小或方向。这对我来说比从PHP获取ImageSize慢:Fast image:0.079681873321533s Native getimage size:0.023485898971558s Raeger(webarto示例):0.16773s如果速度再慢一点,我会非常感兴趣,你做了多少次测试?你可以查看源代码-通常低于1kb的图片需要下载。我真的很喜欢这个类。不管你怎么用fopen。因此,您需要很长时间才能在服务器过载的情况下减缓远程请求的响应速度。你为什么不改用卷发呢?一些网站需要假标题(http_referer)来检索图像尺寸。所以CURL更好。如果我想要以字节为单位的文件大小,该怎么办?@codecowboy对本地请求使用filesize(),对远程请求使用HTTP头,对远程请求使用content-length头
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]