ホームページ  >  記事  >  バックエンド開発  >  PHP と Nginx を組み合わせて動的トリミング画像ソリューションを実装する_PHP チュートリアル

PHP と Nginx を組み合わせて動的トリミング画像ソリューションを実装する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:36:19988ブラウズ

私はずっ​​と前に、高性能の PHP 画像の動的トリミング ソリューションについての記事を書きました。その記事は nginx キャッシュとリライトを使用して実装されました。もちろん、そのソリューションには画像が実際には生成されないという問題があります。バイナリ形式でキャッシュに保存されます。キャッシュが失敗した場合は、php にキャッシュを再度生成するようリクエストする必要があります。違いとしては、今のところはこんな感じだと思います。
空き時間を利用して、3 つの画像モード間の切り替えをサポートする静的に生成された画像のサポートを追加しました。これにより、ポータル Web サイト上の画像サイズを自動的にトリミングでき、理論的にはビジネスのニーズも満たせるはずです。 . 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 ( "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 = トリム( $_GET [ 'path'] );
$mode = intval ( $_GET ['mode'] );
$site = トリム ( $_GET ['site'] );
$width = intval ( $_GET [' width'] ) ;
$height = intval ( $_GET ['height'] );

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

$orig_dir = ディレクトリ名( __FILE__ );
if (! array_key_exists ( $site, $site_list )) {
header ( 'HTTP/1.1 400 Bad Request' );
exit ();
}

if ($mode > 3 || $モード ヘッダー ( 'HTTP/1.1 400 Bad Request' );
exit ();
}

$orig_file = $site_list [$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 = ディレクトリ名 ( $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 = $target_height / $orig_height;
$new_height = $target_height;
}
} else if ($mode = = "2"){ / //画像を消し、$ desired_aspect = $ target_height; ($orig_width / $desired_aspect); $ Trim = $ Orig_height * $ Desired_aspect);
}}} $ iMage-& GT ;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 );
}

3. nginx.conf の設定

コードをコピーします コードは次のとおりです:

server {
Listen 80;
server_name test.yourdomain.com;
root /mnt/webroot/ test;
、テスト、
* )/(d+)x(d+)-(d)/(.*) $1/s/resize.php?site=$2&width=$3&height=$4&mode=$5&path=$6 last;
Break; fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name; nginx が生成されたイメージをキャッシュするかどうかに関係なく、PHP コードに 1 行を追加します



コードをコピーしますコードは次のとおりです:

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

CDN を使用するときに非常に役立ちます。具体的な影響は、クライアントがこのファイルに初めてアクセスしたときの http ステータス コードが 200 になることです。更新後のステータス コードは常に 304 になります。




http://www.bkjia.com/PHPjc/739780.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/739780.html
技術記事

ずっと前に、私は高性能 PHP 画像の動的トリミング ソリューションに関する記事を書きました。その記事は、もちろん、CDN と組み合わせて nginx キャッシュとリライトを使用して実装されました。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。