Maison > développement back-end > tutoriel php > Nginx下php如何动态裁剪图片

Nginx下php如何动态裁剪图片

WBOY
Libérer: 2016-07-25 09:13:04
original
1054 Les gens l'ont consulté

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

利用空余时间,新增了静态生成图片支持,支持对图片3种模式切换,在门户网站自动对图片尺寸进行裁剪,减少服务器带宽,图片裁剪使用了Imagick组件。

一、思路再现: 1、先写好请求服务器生成图片动态脚本,主要就是对图片进行等比缩放计算+裁剪。 2、确定想要生成的url规则,比如http://www.domain.com/www/300×200-1/test.jpg。 3、对浏览器做缓存处理。 4、结束。

二、动态裁剪图片的PHP脚本

  1. /**

  2. * Author pony_chiang
  3. * 高性能图像裁剪方案
  4. * 需要php-imagick扩展
  5. */
  6. ini_set ( "memory_limit", "80M" );
  7. // 请求地址比如 http://yourdomain.com/resize.php?site=www&width=300&height=200&mode=2&path=uploadfile/helloworld.png

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

  10. $mode = intval ( $_GET ['mode'] );
  11. $site = trim ( $_GET ['site'] );
  12. $width = intval ( $_GET ['width'] );
  13. $height = intval ( $_GET ['height'] );
  14. $site_list = array ('www' => '/mnt/webroot/test/' );

  15. $orig_dir = dirname ( __FILE__ );

  16. if (! array_key_exists ( $site, $site_list )) {
  17. header ( 'HTTP/1.1 400 Bad Request' );
  18. exit ();
  19. }
  20. if ($mode > 3 || $mode header ( 'HTTP/1.1 400 Bad Request' );

  21. exit ();
  22. }
  23. $orig_file = $site_list [$site] . $path;

  24. if (! file_exists ( $orig_file )) {
  25. header ( 'HTTP/1.1 404 Not Found' );
  26. exit ();
  27. }
  28. $file_ext = '.' . pathinfo ( $path, PATHINFO_EXTENSION );

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

  30. $save_path = "{$orig_dir}/{$site}/{$width}x{$height}-{$mode}/{$path}";
  31. $save_dir = dirname ( $save_path );
  32. if (! file_exists ( $save_dir ))

  33. wpx_mkdir ( $save_dir );
  34. $target_width = $width;

  35. $target_height = $height;
  36. $new_width = $target_width;

  37. $new_height = $target_height;
  38. $image = new Imagick ( $orig_file );
  39. list ( $orig_width, $orig_height, $type, $attr ) = getimagesize ( $orig_file );
  40. if ($mode == "0") {

  41. //等比缩放图像
  42. $new_height = $orig_height * $new_width / $orig_width;
  43. if ($new_height > $target_height) {
  44. $new_width = $orig_width * $target_height / $orig_height;
  45. $new_height = $target_height;
  46. }
  47. } else if ($mode == "2") {
  48. // 放大并裁剪图像
  49. $desired_aspect = $target_width / $target_height;
  50. $orig_aspect = $orig_width / $orig_height;
  51. if ($desired_aspect > $orig_aspect) {

  52. $trim = $orig_height - ($orig_width / $desired_aspect);
  53. $image->cropImage ( $orig_width, $orig_height - $trim, 0, $trim / 2 );
  54. error_log ( "HEIGHT TRIM $trim" );
  55. } else {
  56. $trim = $orig_width - ($orig_height * $desired_aspect);
  57. $image->cropImage ( $orig_width - $trim, $orig_height, $trim / 2, 0 );
  58. } bbs.it-home.org
  59. }
  60. $image->resizeImage ( $new_width, $new_height, imagick::FILTER_LANCZOS, 1 );

  61. $image->writeImage ( $save_path );
  62. header ( 'Content-Type: image/jpeg' );
  63. header ( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' );
  64. echo file_get_contents ( $save_path );
  65. return true;
  66. // 循环生成目录

  67. function wpx_mkdir($dir, $mode = 0777) {
  68. if (is_dir ( $dir ) || @mkdir ( $dir, $mode ))
  69. return true;
  70. if (! wpx_mkdir ( dirname ( $dir ), $mode ))
  71. return false;
  72. return @mkdir ( $dir, $mode );
  73. }
复制代码

三、nginx.conf配置

  1. server {

  2. listen 80;
  3. server_name test.yourdomain.com;
  4. root /mnt/webroot/test;
  5. index index.php;
  6. expires 30d;
  7. location /s {

  8. #只有当没有生成这张图片时才调用动态裁剪
  9. if (!-e $request_filename) {
  10. rewrite ^([^\.]*)/s/(.*)/(\d+)x(\d+)-(\d)/(.*) $1/s/resize.php?site=$2&width=$3&height=$4&mode=$5&path=$6 last;
  11. break;
  12. }
  13. }
  14. error_page 404 403 402 500 502 503 504 /404.html;

  15. location = /404.html {
  16. }
  17. location ~ \.php$ {

  18. fastcgi_pass 127.0.0.1:9000;
  19. fastcgi_index index.php;
  20. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  21. includefastcgi_params;
  22. }
  23. }

复制代码

说明,强调下关于浏览器缓存的文章,不管是否是通过php生成的图片也好,还是使用nginx缓存生成的图片也罢,在php代码中添加一行

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

对使用CDN有莫大的帮助。 客户端第一次访问此文件的http状态码是200,刷新后状态码一直都是304了,明白其中的好处了,本地客户端缓存了,节省带宽哦。



Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal