Discuz! 官方站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5359|回复: 10

[发布] 公布2个IMAGE类BUG.并附上临时补丁..(使用ImageMagick替换GD库的一定要看)

[复制链接]
发表于 2011-7-30 12:13:54 | 显示全部楼层 |阅读模式
DNSPod 新春好礼 - 域名低至 1 元起,代金券大礼包暖心送!
本帖最后由 haierspi 于 2011-7-30 12:49 编辑

第一个在高负载情况下出现不能识别动态GIF..
导致动态图被缩略图并各帧通过IM被分解成多个文件..
比如

一个10帧得GIF图片 会被分解成
data/attachment/image/79188_300_300-0.jpg
........
data/attachment/image/79188_300_300-9.jpg
10个图片..

并反复执行略图图操作..因为生成不能生成目标文件

data/attachment/image/79188_300_300.jpg

第二个
在开启IM之后一段时间通过进程管理

发现ImageMagick 进程 得名两行 进程 convert 不能正常退出


假死并高占用CPU..(测试的4核服务器 刚开始几天都是100%占用..)

所以在这里发一个临时解决补丁

请下载附件直接覆盖根目录.. 主要修改source\class\class_image.php


覆盖补丁包在这里..


如果你想自己动手修改..下面列出了修改方法

打开source\class\class_image.php
找到(大概160行位置)


  1. $content = fread($fp, $this->imginfo['size']);
复制代码
替换成
  1. if($this->imginfo['size']){
  2.                                 $content = fread($fp, $this->imginfo['size']);
  3.                         }
  4.                         if(!$this->imginfo['size'] || !$content){
  5.                                 $content = file_get_contents($source);
  6.                         }
复制代码


找到(第295行)

  1. function Thumb_IM() {
  2.                 global $_G;

  3.                 switch($this->param['thumbtype']) {
  4.                         case 'fixnone':
  5.                         case 1:
  6.                                 if($this->imginfo['width'] >= $this->param['thumbwidth'] || $this->imginfo['height'] >= $this->param['thumbheight']) {
  7.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -geometry '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' '.$this->source.' '.$this->target;
  8.                                         $return = $this->exec($exec_str);
  9.                                         if($return < 0) {
  10.                                                 return $return;
  11.                                         }
  12.                                 }
  13.                                 break;
  14.                         case 'fixwr':
  15.                         case 2:
  16.                                 if(!($this->imginfo['width'] < $this->param['thumbwidth'] || $this->imginfo['height'] < $this->param['thumbheight'])) {
  17.                                         list($startx, $starty, $cutw, $cuth) = $this->sizevalue(1);
  18.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -crop '.$cutw.'x'.$cuth.'+'.$startx.'+'.$starty.' '.$this->source.' '.$this->target;
  19.                                         $return = $this->exec($exec_str);
  20.                                         if($return < 0) {
  21.                                                 return $return;
  22.                                         }
  23.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -thumbnail \''.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].'>\' -resize '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' -gravity center -extent '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' '.$this->target.' '.$this->target;
  24.                                         $return = $this->exec($exec_str);
  25.                                         if($return < 0) {
  26.                                                 return $return;
  27.                                         }
  28.                                 } else {
  29.                                         $startx = -($this->param['thumbwidth'] - $this->imginfo['width']) / 2;
  30.                                         $starty = -($this->param['thumbheight'] - $this->imginfo['height']) / 2;
  31.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -crop '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].'+'.$startx.'+'.$starty.' '.$this->source.' '.$this->target;
  32.                                         $return = $this->exec($exec_str);
  33.                                         if($return < 0) {
  34.                                                 return $return;
  35.                                         }
  36.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -thumbnail \''.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].'>\' -gravity center -extent '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' '.$this->target.' '.$this->target;
  37.                                         $return = $this->exec($exec_str);
  38.                                         if($return < 0) {
  39.                                                 return $return;
  40.                                         }
  41.                                 }
  42.                                 break;
  43.                 }
  44.                 return 1;
  45.         }
复制代码
替换

  1. function Thumb_IM() {
  2.                 global $_G;

  3.                 switch($this->param['thumbtype']) {
  4.                         case 'fixnone':
  5.                         case 1:
  6.                                 if($this->imginfo['width'] >= $this->param['thumbwidth'] || $this->imginfo['height'] >= $this->param['thumbheight']) {
  7.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -geometry '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' '.$this->source.' '.$this->target;
  8.                                         $return = $this->exec($exec_str);
  9.                                         if($return < 0) {
  10.                                                 return $return;
  11.                                         }
  12.                                 }
  13.                                 break;
  14.                         case 'fixwr':
  15.                         case 2:
  16.                                 if((substr($this->source,-4)=='.gif') && (substr($this->target,-4)=='.jpg' || substr($this->target,-4)=='.jpe' || substr($this->target,-5)=='.jpeg')){
  17.                                         $animatedmaybe = '[0]';
  18.                                 }else{
  19.                                         $animatedmaybe = '';
  20.                                 }
  21.                                 if(!($this->imginfo['width'] < $this->param['thumbwidth'] || $this->imginfo['height'] < $this->param['thumbheight'])) {
  22.                                         list($startx, $starty, $cutw, $cuth) = $this->sizevalue(1);
  23.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -crop '.$cutw.'x'.$cuth.($startx<0 ?$startx:'+'.$startx).($starty<0 ?$starty:'+'.$starty).' '.$this->source.$animatedmaybe.' '.$this->target;
  24.                                         $return = $this->exec($exec_str);
  25.                                         if($return < 0) {
  26.                                                 return $return;
  27.                                         }
  28.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -thumbnail \''.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].'>\' -resize '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' -gravity center -extent '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' '.$this->target.' '.$this->target;
  29.                                         $return = $this->exec($exec_str);
  30.                                         if($return < 0) {
  31.                                                 return $return;
  32.                                         }
  33.                                 } else {
  34.                                         $startx = -($this->param['thumbwidth'] - $this->imginfo['width']) / 2;
  35.                                         $starty = -($this->param['thumbheight'] - $this->imginfo['height']) / 2;
  36.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -crop '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].($startx<0 ?$startx:'+'.$startx).($starty<0 ?$starty:'+'.$starty).' '.$this->source.$animatedmaybe.' '.$this->target;
  37.                                         $return = $this->exec($exec_str);
  38.                                         if($return < 0) {
  39.                                                 return $return;
  40.                                         }
  41.                                         $exec_str = $this->param['imageimpath'].'/convert -quality '.intval($this->param['thumbquality']).' -thumbnail \''.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].'>\' -gravity center -extent '.$this->param['thumbwidth'].'x'.$this->param['thumbheight'].' '.$this->target.' '.$this->target;
  42.                                         $return = $this->exec($exec_str);
  43.                                         if($return < 0) {
  44.                                                 return $return;
  45.                                         }
  46.                                 }
  47.                                 break;
  48.                 }
  49.                 return 1;
  50.         }
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

1

查看全部评分

发表于 2011-7-30 12:37:25 | 显示全部楼层
没有人顶吗,这可是技术贴
回复

使用道具 举报

 楼主| 发表于 2011-7-30 21:18:38 | 显示全部楼层
哦... 呵呵...
回复

使用道具 举报

发表于 2011-7-30 21:37:07 | 显示全部楼层
技术贴可要支持一下
回复

使用道具 举报

发表于 2011-7-30 21:39:27 | 显示全部楼层
翡翠感谢!
回复

使用道具 举报

发表于 2011-7-30 22:48:48 | 显示全部楼层
还看不懂,等官方说法
回复

使用道具 举报

发表于 2011-7-30 22:52:57 | 显示全部楼层
技术贴,必须支持
回复

使用道具 举报

发表于 2011-7-30 23:14:34 | 显示全部楼层
悄悄的收藏。。。
回复

使用道具 举报

发表于 2011-7-30 23:16:23 | 显示全部楼层
本帖最后由 oin 于 2011-7-30 23:16 编辑

{:soso_e142:}

全面禁了gif  卡死的
回复

使用道具 举报

发表于 2011-7-30 23:58:00 | 显示全部楼层
不是很懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

腾讯云自营「网站建设」全新上线!仅需1元,即可快速体验企业官网、电商网站的海量精美模版

小黑屋|Discuz! 官方站 ( 粤B2-20090059-165 )star

GMT+8, 2021-8-3 21:38

Powered by Discuz! X3.4

Copyright © 2001-2019 Tencent Cloud.

快速回复 返回顶部 返回列表