Önbelleğe alınmış bir görüntü çağırırken Hangisi daha hızlı / daha verimli?

5 Cevap php

i php bir görüntü resizer yaptı. Bir görüntü resized olduğunda, yeni boyutları ile yeni bir jpg dosyası önbelleğe alır. Yeni jpg zaten oluşturulmuş olup olmadığını aramak dahaki sefere kesin img.php?file=hello.jpg&size=400 bunu denetler.

  1. Henüz oluşturulmuş değil ise, bu dosya oluşturur ve daha sonra çıkışı (cool) yazdırır.
  2. Zaten varsa, yeni dosya oluşturulur gerekiyor ve bunun yerine, sadece önceden önbelleğe dosyasını çağırır.

Benim sorum, ikinci senaryoya ilişkin olduğunu. Bunlardan hangisi daha hızlı?

  1. yönlendirme: header('Location: cache/hello_400.jpg');die();
  2. grabbing data and printing the cached file: $data = file_get_contents('cache/hello_400.jpg'); header('Content-type: '.$mime); header('Content-Length: '.strlen($data)); echo $data;

Bunu geliştirmek için başka yollar?

If someone wants the generated code, check this out: http://egobits.com/misc/img.phps

Yardım için herkese teşekkürler!

5 Cevap

Bunu geliştirmek için başka yollar?

Evet.

There is a way to send nothing but just an HTTP header: a conditional get.
You can take a look at the similar script, http://shiftingpixel.com/2008/03/03/smart-image-resizer/, for the implementation

Ben tarayıcı veriyi yazdırmayı asla tercih olacaktır. Her iki senaryo oluşturulan görüntünün kalıcı bir yönlendirme atmak gerekir. Yer başlığı gönderilmeden önce görüntü henüz yoksa dışında, oluşturulur.

Edit:

Sadece Ben kalıcı yönlendirme kastım açık olmak ...

header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://path/to/image'); 

Belki aşağıdakileri yapabilirsiniz:

  1. Bu görüntüler için bazı dizini ayarlayın.
  2. Bu dizinde görüntülere Link (<a href="/img/resizable/hello_400.jpg>).
  3. Görüntü henüz yok, eğer php komut yönlendirme için web sunucusu olarak ayarlayın. Apache üzerinde iseniz, basit bir. Htaccess yapacağız. PHP olarak, $_SERVER["REQUEST_URI"] hangi sen boyutlandırmak hangi görüntü söyleyebilir var.
  4. Script kaydeder ve görüntüyü yankıları (ama sadece ilk defa denir).

Bu şekilde, sizin bazı faydaları olsun:

  • Görüntü başka bir statik dosya olarak (bir proxy veya tarayıcıda) önbelleğe alınır.
  • PHP her isteği sadece istatiksel verileri yönlendirmek veya çıkış için çağrılacak zorunda değildir.
  • Sen webserver If-modified-since ve diğer önbellek ilgili başlıkların uygulanması bırakın.
  • Ve bağlantılar güzel :-) bakmak

. Senin / img / boyutlandırılabilir klasöründe örnek htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /img.php [L]

Üçüncü bir (daha güçlü) bir seçenek olarak: bir veritabanında bir ikili alanda görüntü önbelleğe ve bunun için veritabanını sorgulamak.

Her üç çözümleri ve kriter bunları uygulamak.

Ben ikinci seçeneği (? Izle) gibi çok çaba gerektirir, ancak ikinci bir isteği ve daha fazla yükü içerir çünkü ilk seçenek (yönlendirme), gerçek dünyada yavaş olacağını tahmin gidiyorum.

Senin durumunda Eğer mümkünse, aynı zamanda doğrudan html benzeri önbelleğe görüntünün url ayarlamak için bir işlevi uygulayabilirsiniz:

<img src="<?php getImageUrl('hello.jpg', 400); ?>" />

o dinamik boyutlandırılan görüntüyü oluşturmak için url dönecektir başka varsa getImageUrl () önbelleğe alınan görüntünün url dönecektir.