Resimler neden istemcide önbelleğe benim web sunucusundan hizmet mi?

4 Cevap php

Ben web sunucusu benim resimlerin geri önbellek başlık göndermek mümkün olduğu anlamına gelir ki, (/var/www/ önce) webroot arkasında benim tüm görüntüleri saklayın. Ne kullanıcının web önbellek işi yapmak için bu eklemek gerekiyor? Şu anda, bu aynı tarayıcı tarafından her zaman isabet oluyor.

Sayfalarıma My <img> yol şuna benzer:

<img src="pic.php?u=1134&i=13513&s=0">

Edit: o "pic.php?u=1134&i=13513&s=0" geçerli bir dosya adı ya da bir şey değil çünkü bu olabilir mi?

// pic.php
<?php

    // open the file in a binary mode
    $user = $_GET['u'];
    $id = $_GET['i'];
    $s = $_GET['s'];

    if (!isset($user) && !isset($s) && $isset($id))
    {
    	// display a lock!
    	exit(0);
    }

    require_once("bootstrap_minimal.php"); //setup db connection, etc

    // does this image_id belong to the user?
    $stmt = $db->query('SELECT image_id, user_id, file_name, private FROM images WHERE image_id = ?', $id);
    $obj = $stmt->fetchObject();

    if (is_object($obj))
    {
    	// is the picture is the users?
    	if ($obj->user_id != $_SESSION['user_id'])
    	{
    		// is this a private picture?
    		if ($obj->private == 1)
    		{
    			// check permissions...
    			// display a lock in needed!
    		}
    	}
    }
    else
    {
    	// display a error pic?!
    	exit(0);
    }

    if ($s == 0)
    {
    	$picture = $common->getImagePathThumb($obj->file_name);
    }
    else
    {
    	$picture = $common->getImagePath($obj->file_name);
    }

    // send the right headers
    header("Content-Type: image/png");
    header("Content-Length: " . filesize($picture));

    $fp = fopen($picture, 'rb');

    // dump the picture and stop the script
    fpassthru($fp);
    exit;
?>

4 Cevap

Sen gibi bir şey eklemek gerekir:

$expiry = 3600*24*7; // A week
header('Expires: ' . gmdate('D, d M Y H:i:s' time() + $expiry) . ' GMT');
header('Cache-control: private, max-age=' . $expiry);

Apache varsayılan olarak yalnızca statik dosyaları önbelleğe alır. Sen header() fonksiyonu ile bir önbellek denetim başlığı göndermeniz gerekir. This article konu hakkında bilgi bir yeri vardır.

Alternatif olarak, görüntünün gerçek konuma yönlendirmek için PHP dosyasını kullanabilirsiniz. (Bu muhtemelen başlıklarıyla ilgili hiçbir şey bilmiyorsanız en kolay yoludur.)

Sen deneyebilirsiniz:

header("Cache-Control: max-age=3600");

Bu dosya üzerinde bir saat önbellek zaman aşımı göndermeniz gerekmektedir.

Basit cevap: bunu önbelleğe için kullanıcıların tarayıcı söylemiyorlar