search

Home  >  Q&A  >  body text

gd - PHP生成图片太慢了。。有些都不出来、

现在为了使用不同宽高的图片,做了个动态生成的程序。每次根据图片传入的宽高来输出图片,然后 html 页面里用

<img src="xxx.com/img?src=c8d997dae152b2bfdfd0a48a6142ec_900_400.jpg" />

这个就是 900X400 的。

用也就是 php 的 GD 库来创建个图层,来根据比例重新画出一个图

imagecreatetruecolor($_n_w,$_n_h);
imagecopyresampled($this->new,$this->img,0,0,$_cut_width,$_cut_height,$new_width,$new_height,$this->width,$this->height);

最后输出图片让 html 引用 这个地址就行了

header("Content-type: image/png");
imagepng($imgsrc);

现在问题是 html 引用了后,好多图片会出现一半,或者不出来了,效率太低了,有什么改进办法没?

阿神阿神2774 days ago532

reply all(10)I'll reply

  • 巴扎黑

    巴扎黑2017-04-10 15:16:33

    PHP处理图片本来就耗服务器资源~~如果你一个页面有很多需要这种时时去处理的图片资源~~服务器能忙过来~~

    就楼上所提的一样~~通过PHP程序或rewrite来判断该尺寸的图片是否已经存在,不存在处理。这样可以减轻服务器的压力应该会提升处理的速度吧。~

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 15:16:33

    樓下那些重複我的答案卻不點讚的幾個意思 ╮( ̄﹏ ̄)╭


    首先,放棄 GD,改用 imagick。 \( ̄- ̄)/

    其次,緩存。

    最簡單的緩存設計:

    url 爲 cache/image0001-1024x768.jpg

    如果服務器找不到,則交給 PHP 處理,生成的結果保存,下一次就和靜態資源沒甚區別了。 (○′ω`○)

    再次,實際使用時完全沒有必要把各種大小都用上,固定用幾個就行了,後端的強大是爲了前端的方便而不是偷懶 ( ̄ˇ ̄)

    比如 wikipedia 雖然支持任意縮放,但一般情況顯示的都是幾個固定大小,所以基本上也不會出現重複運算。╮( ̄▽ ̄)╭

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 15:16:33

    直接用 CDN 服务商的自动缩略图工具吧,好像 upyun 和 qiniu 都有这种接口的。

    不然的话,就使用 ImageMagick 库,比 GD 快不知道多少倍。

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:16:33

    这个设计本身就是错误的,比较科学的设计是实现计划好所有的可能,然后选几个分界点,在图片上传的同时,生成比如4-5个尺寸的图片,每次就是纯静态访问了
    其余的尺寸就是用浏览器自身的缩放

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:16:33

    用js控制吧,去github上搜几个库用用就行
    https://github.com/search?utf8=%E2%9C%93&q=img+fit

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:16:33

    和一楼观点相反,这不是错误的设计,这种更科学。就如楼上所说至少得加上缓存
    另外附上一个图片缩略服务的项目https://github.com/thumbor/thumbor

    reply
    0
  • PHPz

    PHPz2017-04-10 15:16:33

    用imagick和ImageMagick库吧

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:16:33

    1.使用ImageMagick
    2.每次生成图片的时候判断这个尺寸的图片是否存在,不存在,再生成。。。然后保存(也就是缓存吧)

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:16:33

    推荐直接使用CDN商,例如七牛,我自己就是用七牛的,定了一套规则,把资源目录给做成一个子域,然后镜像就解决问题,不需要整各种同步脚本。

    reply
    0
  • 阿神

    阿神2017-04-10 15:16:33

    有的cdn支持图片缩略图功能,

    或者自己 rewrite 判断文件是否存在,不存在php处理完生成到相同路径。

    比如: /thumb/12345_100x100.jpg 第一次用PHP处理生成到 /thumb/12345_100x100.jpg,下次文件存在就直接返回了。

    reply
    0
  • Cancelreply