Heim Backend-Entwicklung PHP-Tutorial Nginx下php如何动态裁剪图片

Nginx下php如何动态裁剪图片

Jul 25, 2016 am 09:13 AM

以前写过一篇也是关于高性能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了,明白其中的好处了,本地客户端缓存了,节省带宽哦。



Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Apr 06, 2025 am 12:02 AM

Die Hijacking der Sitzung kann in den folgenden Schritten erreicht werden: 1. Erhalten Sie die Sitzungs -ID, 2. Verwenden Sie die Sitzungs -ID, 3. Halten Sie die Sitzung aktiv. Zu den Methoden zur Verhinderung der Sitzung der Sitzung in PHP gehören: 1. Verwenden Sie die Funktion Session_regenerate_id (), um die Sitzungs -ID zu regenerieren. 2. Store -Sitzungsdaten über die Datenbank, 3. Stellen Sie sicher, dass alle Sitzungsdaten über HTTPS übertragen werden.

Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Apr 03, 2025 am 12:04 AM

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Mar 31, 2025 pm 11:54 PM

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

Wie debugge ich den CLI -Modus in PhpStorm? Wie debugge ich den CLI -Modus in PhpStorm? Apr 01, 2025 pm 02:57 PM

Wie debugge ich den CLI -Modus in PhpStorm? Bei der Entwicklung mit PHPSTORM müssen wir manchmal den PHP im CLI -Modus (COMS -Zeilenschnittstellen) debuggen ...

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Apr 01, 2025 pm 03:12 PM

Senden von JSON -Daten mithilfe der Curl -Bibliothek von PHP in der PHP -Entwicklung müssen häufig mit externen APIs interagieren. Eine der gängigen Möglichkeiten besteht darin, die Curl Library zu verwenden, um Post � ...

See all articles