這次給大家帶來nginx內php動態裁剪圖片步驟詳解,nginx內php動態裁剪圖片的注意事項有哪些,下面就是實戰案例,一起來看一下。
以前寫過一篇也是關於高效能PHP圖片動態裁剪方案的文章,那文章使用的是nginx Cache和rewrite實現的,當然再加上CDN,那個方案存在一個問題就是圖片並沒有實際產生,而是以二進位的形式存在緩衝中。如果緩衝失效了那麼還需要請求php再次產生。如果說到區別這是我暫且認為的吧。
利用空餘時間,新增了靜態產生圖片支援,支援對圖片3種模式切換,在門戶網站自動對圖片尺寸進行裁剪,減少伺服器頻寬,圖片裁剪使用了Imagick組件。
一、思路再現:
1、先寫好請求伺服器產生圖片動態指令碼,主要就是對圖片進行等比縮放計算+裁剪。
2、確定想要產生的url規則,比如http://www.domain.com/www/300×200-1/test.jpg。
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 ); } www.jbxue.com}$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; includefastcgi_params;}}
說明,強調下關於瀏覽器緩衝的文章,不管是否是通過php產生的圖片也好,還是使用nginx緩衝產生的圖片也罷,在php代碼中添加一行
header('Last-Modified: ' .gmdate('D, d M Y H:i:s') . ' GMT' );
對使用CDN有莫大的協助。
用戶端第一次訪問此檔案的http狀態代碼是200,重新整理後狀態代碼一直都是304了,明白其中的好處了,本地用戶端緩衝了,節省頻寬哦。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
PHP按行讀取檔案時刪除分行符號操作詳解
php判斷遠程圖片能否被調用