您当前的位置: 首页 > 网站编程 > PHP教程 > PHP加Nginx实现动态裁剪图片方案

PHP加Nginx实现动态裁剪图片方案

作者:不详 来源:网络 发布时间: 2014-08-06 23:26 点击:
这篇文章主要介绍了PHP加Nginx实现动态裁剪图片的方案,使用Imagick组件实现,需要的朋友可以参考下 许久以前写过一篇也是关于高性能PHP图片动态裁剪方案的文章,那文章使用的是nginx Cache和rewrite实现的,当然再加上CDN,那个方案存在一个问题就是图片并没有实际生成

PHP加Nginx实现动态裁剪图片方案

  这篇文章主要介绍了PHP加Nginx实现动态裁剪图片的方案,使用Imagick组件实现,需要的朋友可以参考下

  许久以前写过一篇也是关于高性能PHP图片动态裁剪方案的文章,那文章使用的是nginx Cache和rewrite实现的,当然再加上CDN,那个方案存在一个问题就是图片并没有实际生成,而是以二进制的形式存在缓存中。如果缓存失效了那么还需要请求php再次生成。如果说到区别这是我暂且认为的吧。

  利用空余时间,新增了静态生成图片支持,支持对图片3种模式切换,在门户网站自动对图片尺寸进行裁剪,减少服务器带宽,理论上应该也满足了业务的需求吧,图片裁剪使用了Imagick组件。

  一、思路再现:

  1、先写好请求服务器生成图片动态脚本,主要就是对图片进行等比缩放计算+裁剪。

  2、确定你想要生成的url规则。

  3、对浏览器做缓存处理。

  4、结束。

  二、动态裁剪PHP脚本

  代码如下:

  /**

  * Author pony_chiang

  * 高性能图像裁剪方案

  * 需要php-imagick扩展

  */

  ini_set ( "memory_limit", "80M" );

  // 请求地址比如 http://yourdomain.com/resize.php?site=www&width=300&height=200&mode=2&path=uploadfile/helloworld.png

  // nginx重写规则 rewrite ^([^.]*)/s/(.*)/(d+)x(d+)-(d)/(.*) $1/s/resize.php?site=$2&width=$3&height=$4&mode=$5&path=$6 last;

  $path = trim ( $_GET ['path'] );

  $mode = intval ( $_GET ['mode'] );

  $site = trim ( $_GET ['site'] );

  $width = intval ( $_GET ['width'] );

  $height = intval ( $_GET ['height'] );

  $site_list = array ('www' => '/mnt/webroot/test/' );

  $orig_dir = dirname ( __FILE__ );

  if (! array_key_exists ( $site, $site_list )) {

  header ( 'HTTP/1.1 400 Bad Request' );

  exit ();

  }

  if ($mode > 3 || $mode < 0) {

  header ( 'HTTP/1.1 400 Bad Request' );

  exit ();

  }

  $orig_file = $site_list [$site] . $path;

  if (! file_exists ( $orig_file )) {

  header ( 'HTTP/1.1 404 Not Found' );

  exit ();

  }

  $file_ext = '.' . pathinfo ( $path, PATHINFO_EXTENSION );

  $file_name = basename ( $path, $file_ext );

  $save_path = "{$orig_dir}/{$site}/{$width}x{$height}-{$mode}/{$path}";

  $save_dir = dirname ( $save_path );

  if (! file_exists ( $save_dir ))

  wpx_mkdir ( $save_dir );

  $target_width = $width;

  $target_height = $height;

  $new_width = $target_width;

  $new_height = $target_height;

  $image = new Imagick ( $orig_file );

  list ( $orig_width, $orig_height, $type, $attr ) = getimagesize ( $orig_file );

  if ($mode == "0") {

  //等比缩放图像

  $new_height = $orig_height * $new_width / $orig_width;

  if ($new_height > $target_height) {

  $new_width = $orig_width * $target_height / $orig_height;

  $new_height = $target_height;

  }

  } else if ($mode == "2") {

  // 放大并裁剪图像

  $desired_aspect = $target_width / $target_height;

  $orig_aspect = $orig_width / $orig_height;

  if ($desired_aspect > $orig_aspect) {

  $trim = $orig_height - ($orig_width / $desired_aspect);

  $image->cropImage ( $orig_width, $orig_height - $trim, 0, $trim / 2 );

  error_log ( "HEIGHT TRIM $trim" );

  } else {

  $trim = $orig_width - ($orig_height * $desired_aspect);

  $image->cropImage ( $orig_width - $trim, $orig_height, $trim / 2, 0 );

  }

  }

  $image->resizeImage ( $new_width, $new_height, imagick::FILTER_LANCZOS, 1 );

  $image->writeImage ( $save_path );

  header ( 'Content-Type: image/jpeg' );

  header ( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' );

  echo file_get_contents ( $save_path );

  return true;

  // 循环生成目录

  function wpx_mkdir($dir, $mode = 0777) {

  if (is_dir ( $dir ) || @mkdir ( $dir, $mode ))

  return true;

  if (! wpx_mkdir ( dirname ( $dir ), $mode ))

  return false;

  return @mkdir ( $dir, $mode );

  }

  三、nginx.conf配置

  代码如下:

  server {

  listen 80;

  server_name test.yourdomain.com;

  root /mnt/webroot/test;

  index index.php;

  expires 30d;

  location /s {

  #只有当没有生成这张图片时才调用动态裁剪

  if (!-e $request_filename) {

  rewrite ^([^.]*)/s/(.*)/(d+)x(d+)-(d)/(.*) $1/s/resize.php?site=$2&width=$3&height=$4&mode=$5&path=$6 last;

  break;

  }

  }

  error_page 404 403 402 500 502 503 504 /404.html;

  location = /404.html {

  }

  location ~ .php$ {

  fastcgi_pass 127.0.0.1:9000;

  fastcgi_index index.php;

  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  include fastcgi_params;

  }

  }

  PS:在文章的末尾我要特别强调一点是关于浏览器缓存的文章,不管你是否是通过php生成的图片也好,还是使用nginx缓存生成的图片也罢,在php代码中添加一行

  复制代码 代码如下:header('Last-Modified: ' .gmdate('D, d M Y H:i:s') . ' GMT' );

  对你使用CDN有十分莫大的帮助。具体产生的效果就是客户端第一次访问此文件的http状态码是200,刷新后状态码一直都是304了。
分享到:
本文"PHP加Nginx实现动态裁剪图片方案"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4