Php ile, önbellek görüntüleri tarayıcı almak nasıl?

5 Cevap php

Ben görüntüleri önbelleğe nasıl tamamen yeni.

Ben php ile bir galeride çıktı tüm görüntüleri ve görüntüler zaten tarayıcı tarafından önbelleğe için, gösterilen, bu yüzden php-komut tekrar çıkışa aynı görüntüyü yok istiyorum. Tüm istediğim görüntüler daha hızlı göstermektir.

bir görüntü çağırırken böyle yapın:

<img src="showImage.php?id=601">

ve showImage.php dosyası yapar:

$resultat = mysql_query("
    SELECT filename, id
    FROM Media 
    WHERE id = '".$_GET['id']."'
");
$data = mysql_fetch_assoc($resultat);

...

//Only if the user are logged in
if(isset($_SESSION['user'])){
    header("Content-Type: image/jpeg");

    //$data['filename'] can be = dsSGKLMsgKkD3325J.jpg
    echo(file_get_contents("images/".$data['filename']."")); 
}

5 Cevap

Eğer kullanıcı mesajı çıktısı önce oturum olup olmadığını kontrol etmek php kullanıyorsanız, o zaman tarayıcı görüntüyü önbelleğe istemiyorum.

Önbelleğe tüm nokta kez sunucusunu aramak ve daha sonra tekrar aramak asla etmektir. Tarayıcı görüntüyü önbelleğe, bu sunucu aramak olmaz ve komut çalışmaz. Bunun yerine, tarayıcı önbelleği resminizi çekin ve görüntülemek, kullanıcı artık oturum olsa bile bu potansiyel çok büyük bir güvenlik açığı olabilir olacaktır.

Eğer oturumları kullanıyorsanız, her şeyden önce, size session_cache_limiter (by setting it to none veya public) devre dışı bırakmanız gerekir. Gönderdiğinde Başlıkları gördüğüm voodoo programlama kötü durum vardır.

session_cache_limiter('none');

Sonra Cache-Control: max-age= number_of_seconds and optionally equivalent Expires: başlık göndermek.

header('Cache-control: max-age='.(60*60*24*365));
header('Expires: '.gmdate(DATE_RFC1123,time()+60*60*24*365));

, Iyi alınabilirlik almak Last-Modified başlık göndermek ve tarayıcı If-Modified-Since başlığı gönderir durumu 304 ve boş gövdeli yanıtlamak için.

header('Last-Modified: '.gmdate(DATE_RFC1123,filemtime($path_to_image)));

Bu (tarihi doğrulamak değil) biraz hile, ama sürece sonsuza kadar önbelleğe alınmış dosya tutmak tarayıcılarını umursamıyorum olarak geçerli olduğunu:

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
   header('HTTP/1.1 304 Not Modified');
   die();
}

İşte 304 başlık desteği için kullanan bazı kod:

  /**
   * @return false if not cached or modified, true otherwise.
   * @param bool check_request set this to true if you want to check the client's request headers and "return" 304 if it makes sense. will only output the cache response headers otherwise.
   **/     
  protected function sendHTTPCacheHeaders($cache_file_name, $check_request = false)
  {
    $mtime = @filemtime($cache_file_name);

    if($mtime > 0)
    {
      $gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
      $etag = sprintf('%08x-%08x', crc32($cache_file_name), $mtime);

      header('ETag: "' . $etag . '"');
      header('Last-Modified: ' . $gmt_mtime);
      header('Cache-Control: private');
      // we don't send an "Expires:" header to make clients/browsers use if-modified-since and/or if-none-match

      if($check_request)
      {
        if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && !empty($_SERVER['HTTP_IF_NONE_MATCH']))
        {
          $tmp = explode(';', $_SERVER['HTTP_IF_NONE_MATCH']); // IE fix!
          if(!empty($tmp[0]) && strtotime($tmp[0]) == strtotime($gmt_mtime))
          {
            header('HTTP/1.1 304 Not Modified');
            return false;
          }
        }

        if(isset($_SERVER['HTTP_IF_NONE_MATCH']))
        {
          if(str_replace(array('\"', '"'), '', $_SERVER['HTTP_IF_NONE_MATCH']) == $etag)
          {
            header('HTTP/1.1 304 Not Modified');
            return false;
          }
        }
      }
    }

    return true;
  }

Bu gibi onları gömmek olur böylece "ShowImage" adlı bir dizinde oluşturulan görüntüleri depolamak

<img src="showimage/601.jpg" />

. Sonra showImage.php arayacak aynı dizinde bir htaccess dosyası yerleştirmek id = dosya yok durumda, örneğin:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)\.jpg$ showImage.php?id=$1 [QSA,L]
</IfModule>


Sadece istemci tarafında önbelleğe alma yapmak istediğiniz Yorumlarınız okumak: Sadece göre önbelleğe alma ile ilgili HTTP başlıklarını set http://www.mnot.net/cache%5Fdocs/


http://php.net/mysql%5Freal%5Fescape%5Fstring: Eğer dezenfekte yok çünkü / $ _GET ['id'] kaçmak, sorgu SQL injections savunmasız olduğunu unutmayın

Görüntüler bazı kimliğini tespit kaynaktır hitap etmeyiniz. tercihen bir alt etki alanı, görüntüler için mutlak adresler kullanmak, tercihen az çerez. Tarayıcı görüntülerde önbelleğe alma yapacağız. Web sitelerinde daha hızlı resim yüklemek için bir düzgün hile bazı CDN veya başka sitede koymaktır. Bu çünkü tarayıcılar bir etki paralel isteği parçacığı sayısını sınırlamak.

Görüntüleri ile çalışan bir başka temiz şekilde bakmak, Spriting edilir. Bu çok fazla bant genişliği tasarrufu sağlar ve aynı zamanda ister.

Hız çok önemli olup olmadığını da doğrudan bitmap yükleme kullanabilirsiniz. Bu olsa büyük görüntüler için tavsiye edilmez. Onun simgeler ve küçük resim / gif yükleme olduğunu eğer. Sen doğrudan sayfada bitmapler kullanabilirsiniz.