PHP高效獲取遠程圖片尺寸和大小的實現方法
本方法非常實用,以前都是用一些圖片擴展庫去拿圖片信息的,很笨啊。
在這裡分享一下自己的心得,希望和大家一起分享技術,如果有什麼不足,還請大家指正。寫出這篇目的,就是希望大家一起成長,我也相信技術之間沒有高低,只有互補,只有分享,才能使彼此更加成長。
實現代碼:
<?phpn/** n * 獲取遠程圖片的寬高和體積大小 n * n * @param string $url 遠程圖片的鏈接 n * @param string $type 獲取遠程圖片資源的方式, 默認為 curl 可選 fread n * @param boolean $isGetFilesize 是否獲取遠程圖片的體積大小, 默認false不獲取, n * 設置為 true 時 $type 將強製為 fread n * @return false|array n */ nfunction myGetImageSize($url, $type = curl, $isGetFilesize = false) n{ n // 若需要獲取圖片體積大小則默認使用 fread 方式 n $type = $isGetFilesize ? fread : $type; n n if ($type == fread) { n // 或者使用 socket 二進位方式讀取, 需要獲取圖片體積大小最好使用此方法 n $handle = fopen($url, rb); n n if (! $handle) return false; n n // 只取頭部固定長度168位元組數據 n $dataBlock = fread($handle, 168); n } n else { n // 據說 CURL 能緩存DNS 效率比 socket 高 n $ch = curl_init($url); n // 超時設置 n curl_setopt($ch, CURLOPT_TIMEOUT, 5); n // 取前面 168 個字元n // 通過四張測試圖讀取寬高結果都沒有問題,若獲取不到數據可適當加大數值 n curl_setopt($ch, CURLOPT_RANGE, 0-167); n // 跟蹤301跳轉 n curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); n // 返回結果 n curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); n n $dataBlock = curl_exec($ch); n n curl_close($ch); n n if (! $dataBlock) return false; n } n n // 將讀取的圖片信息轉化為圖片路徑並獲取圖片信息,經測試,n //這裡的轉化設置 jpeg 對獲取png,gif的信息沒有影響,無須分別設置 n // 有些圖片雖然可以在瀏覽器查看但實際已被損壞可能無法解析信息 n $size = getimagesize(data://image/jpeg;base64,. base64_encode($dataBlock)); n if (empty($size)) { n return false; n } n n $result[width] = $size[0]; n $result[height] = $size[1]; n n // 是否獲取圖片體積大小 n if ($isGetFilesize) { n // 獲取文件數據流信息 n $meta = stream_get_meta_data($handle); n // nginx 的信息保存在 headers 里,apache 則直接在 wrapper_data n $dataInfo = isset($meta[wrapper_data][headers]) ?n $meta[wrapper_data][headers] : $meta[wrapper_data]; n n foreach ($dataInfo as $va) { n if ( preg_match(/length/iU, $va)) { n $ts = explode(:, $va); n $result[size] = trim(array_pop($ts)); n break; n } n } n } n n if ($type == fread) fclose($handle); n n return $result; n} n n// 測試的圖片鏈接 necho <pre>; n$result = myGetImageSize(http://s6.mogujie.cn/b7/bao/n 120630/2kpa6_kqywusdel5bfqrlwgfjeg5sckzsew_345x483.jpg_225x999.jpg, curl); nprint_r($result); necho <hr />; n$result = myGetImageSize(http://s5.mogujie.cn/b7/bao/n 120629/6d3or_kqytasdel5bgevsugfjeg5sckzsew_801x1193.jpg, fread); nprint_r($result); necho <hr />; n$result = myGetImageSize(http://hiphotos.baidu.com/n zhengmingjiang/pic/item/1c5f338c6d22d797503d92f9.jpg, fread, true); nprint_r($result); necho <hr />; n$result = myGetImageSize(http://www.vegandocumentary.com/wp-content/n uploads/2009/01/imveganlogotransparentbackground.png, curl, true); nprint_r($result); necho <hr />; n$result = myGetImageSize(http://jiaoyou.ai9475.com/n front/templates/jiaoyou/styles/default/image/ad_pic_1.gif, fread); nprint_r($result); n
推薦閱讀:
※PHP中的表名要不要define?
※為什麼好多人寫php的時候總是判斷反邏輯呢?
※9段PHP實用功能的代碼推薦
※Linux下php-fpm進程過多導致內存耗盡問題解決
TAG:PHP |