고성능 PHP 이미지 동적 자르기 솔루션에 대한 기사를 작성한 적이 있습니다. 해당 기사는 nginx 캐시 및 재작성을 사용하여 구현되었으며, CDN과 결합되어 해당 솔루션의 한 가지 문제점은 이미지가 실제로 생성되지 않는다는 것입니다. 대신 바이너리 형식으로 캐시에 저장됩니다. 캐시가 실패하면 PHP에 캐시를 다시 생성하도록 요청해야 합니다. 차이점에 대해서는 당분간은 이렇게 생각합니다.
여유 시간을 활용하여 정적으로 생성된 이미지에 대한 지원을 추가하고, 세 가지 이미지 모드 간 전환을 지원하며, 포털 웹사이트에서 이미지 크기를 자동으로 잘라서 서버 대역폭을 줄입니다. 이미지 자르기는 Imagick 구성 요소를 사용합니다.
1. 아이디어 재현:
1. 먼저 서버에 그림 크기 조정, 계산 및 자르기가 포함된 그림 생성을 요청하는 동적 스크립트를 작성합니다.
2. http://www.domain.com/www/300×200-1/test.jpg와 같이 생성하려는 URL 규칙을 결정합니다.
3. 브라우저 캐싱.
4. 끝.
2. 동적으로 이미지를 자르는 PHP 스크립트
-
-
/**
- * 작성자 pony_chiang
- * 고성능 이미지 자르기 솔루션
- * php-imagick 확장 필요
- */
- ini_set( "메모리 제한", "80M" ); p>
// http://yourdomain.com/resize.php?site=www&width=300&height=200&mode=2&path=uploadfile/helloworld.png
- // nginx 재작성 규칙과 같은 주소 요청 ^([^.]*)/s/(.*)/(d )x(d )-(d)/(.*) $1/s/resize.php?site=$2&width=$3&height=$4 다시 작성 &mode=$5&path=$6 last;
$path = 트림( $_GET ['경로'] );
- $mode = intval( $_GET ['모드'] ) ;
- $site = 트림 ( $_GET ['사이트'] );
- $width = intval ( $_GET ['너비'] );
- $height = intval ( $_GET ['높이'] );
$site_list = array ('www' => '/mnt/webroot/test/' );
$orig_dir = dirname ( __FILE__ );
- if (! array_key_exists ( $site, $site_list )) {
- 헤더 ( 'HTTP/1.1 400 잘못된 요청' );
- 종료 ();
- }< /p>
if ($mode > 3 || $mode < 0) {
- 헤더( 'HTTP/1.1 400 잘못된 요청' );
- 종료();
- }
$orig_file = $site_list [$site] . $path;
- if (!file_exists ( $orig_file )) {
- 헤더 ( 'HTTP/1.1 404 찾을 수 없음' );
- 종료 ();
- }
$file_ext = '.' . pathinfo ( $path, PATHINFO_EXTENSION );
$file_name = 기본 이름( $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 ); p>
$target_width = $width;
- $target_height = $height;
$new_width = $target_width;
- $new_height = $target_height ;
- $image = 새 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 $ 트림" );
- } else {
- $trim = $orig_width - ($orig_height * $desired_aspect);
- $image->cropImage ( $orig_width - $trim, $orig_height, $trim / 2 , 0 );
- } bbs.it-home.org
- }
$image->resizeImage ( $new_width, $new_height, imagick::FILTER_LANCZOS, 1 );
- $image->writeImage ( $save_path );
- 헤더( 'Content-Type: image/jpeg' );
- 헤더( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' );
- echo file_get_contents ( $save_path );
- true 반환;
// 디렉토리 생성 루프
- function wpx_mkdir($dir, $mode = 0777) {
- if (is_dir ( $dir ) || @mkdir ( $dir, $mode ))
- return true;
- if (! wpx_mkdir ( dirname ( $ dir ), $mode ))
- false 반환;
- return @mkdir ( $dir, $mode );
- }
-
복사 코드
3. 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) {
- 다시 작성 ^([^.]*)/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('최종 수정: ' .gmdate('D, d M Y H:i:s') . ' GMT' );
코드 복사
는 CDN을 사용하는데 많은 도움이 됩니다.
클라이언트가 처음으로 이 파일에 액세스할 때의 http 상태 코드는 200입니다. 새로 고친 후 상태 코드는 항상 304입니다. 이제 로컬 클라이언트가 이를 캐시하여 대역폭을 절약한다는 이점을 이해하게 되었습니다.
|