Maison  >  Article  >  développement back-end  >  Comment header() génère un exemple d'utilisation du cache d'images

Comment header() génère un exemple d'utilisation du cache d'images

伊谢尔伦
伊谢尔伦original
2017-06-24 13:29:382036parcourir

Lorsque nous générons le code de vérification, nous devons saisir directement l'image, généralement en utilisant header("Content-type: image/jpeg"); ceci. Voici une brève introduction.

Dans de nombreux développements, nous essayons d'utiliser header("Content-type: image/jpeg"); pour générer des images, et essayons d'utiliser la technologie de traitement d'image de PHP pour autoriser la sortie Les images sont plus intelligentes et dynamiques. Mais nous rencontrons souvent de nouveaux problèmes, à moins que vous ne spécifiiez des structures d'URL différentes et que vous n'utilisiez une technologie de serveur pour mettre les images en cache, il est très probable que ces images de sortie consomment beaucoup de trafic. Comment les mettre en cache et appeler le cache lors de la prochaine visite de l'utilisateur ? (Le principe est que vous souhaitez que cette image reste inchangée)

// put this above any php image generation code:
session_start(); 
header("Cache-Control: private, max-age=10800, pre-check=10800");
header("Pragma: private");
header("Expires: " . date(DATE_RFC822,strtotime(" 2 day")));

Ajoutez le code ci-dessus au-dessus de l'en-tête("Content-type: image/jpeg");, qui spécifiera le temps de cache du fichier actuel. page (deux jours) et utilisez ce nœud de temps de cache lors de la prochaine visite.
Ensuite, déterminez s'il existe déjà un cache. Si c'est le cas, utilisez le cache.

Scénario 1 : Si le navigateur met déjà en cache la page actuelle, utilisez-la directement.

// the browser will send a $_SERVER['HTTP_IF_MODIFIED_SINCE'] if it has a cached copy 
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
  // if the browser has a cached version of this image, send 304
  header('Last-Modified: '.$_SERVER['HTTP_IF_MODIFIED_SINCE'],true,304);
  exit;
}

Scénario 2 : Le navigateur met en cache la page actuelle. Bien que nous ayons mis à jour certaines informations sur l'image, l'image source elle-même n'a pas changé et nous souhaitons utiliser le cache précédent, nous utilisons donc également le cache. .

$img = "some_image.png";
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == 
filemtime($img))) {
  // send the last mod time of the file back
  header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($img)).' GMT',true, 304);
  exit;
}

Bien sûr, il existe certaines situations particulières que nous devons considérer, mais le code ci-dessus peut fondamentalement guider notre réflexion. Au fait, n'oubliez pas de tous les mettre au-dessus de header("Content-type: image/jpeg").
Regardons un exemple

<?php
//调整图片大小
/**
 *图片按比例调整大小的原理:
 *1、比较原图大小是否小于等于目标大小,如果是则直接采用原图宽高
 *2、如果原图大小超过目标大小,则对比原图宽高大小
 *3、如:宽>高,则宽=目标宽, 高=目标宽的比例 * 原高
 *4、如:高>宽,则高=目标高,宽=目标高的比例 * 原宽   
**/
 
$image = "test.jpg";
$max_width = 200;
$max_height = 200;
 
$size = getimagesize($image);   //得到图像的大小
$width = $size[0];             
$height = $size[1];
 
$x_ratio = $max_width / $width;
$y_ratio = $max_height / $height;
 
if (($width <= $max_width) && ($height <= $max_height))
{
    $tn_width = $width;
    $tn_height = $height;
}
elseif (($x_ratio * $height) < $max_height)
{
    $tn_height = ceil($x_ratio * $height);
    $tn_width = $max_width;
}
else
{
    $tn_width = ceil($y_ratio * $width);
    $tn_height = $max_height;
}
 
$src = imagecreatefromjpeg($image);
$dst = imagecreatetruecolor($tn_width, $tn_height); //新建一个真彩色图像
imagecopyresampled($dst, $src, 0, 0, 0, 0,$tn_width, $tn_height, $width, $height);        //重采样拷贝部分图像并调整大小
header(&#39;Content-Type: image/jpeg&#39;);
imagejpeg($dst,null,100);
imagedestroy($src);
imagedestroy($dst);
?>


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
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