2010-06-28 13 views
0

La semaine dernière, j'ai converti mes valeurs de src de la page img en pointant sur des fichiers image en utilisant un script PHP pour servir les images. La raison principale était de prendre en charge à la fois les fichiers et les BLOB de base de données en tant que source réelle.Image SRC à partir du script PHP sur IIS - ne pas afficher de manière cohérente

Maintenant, quand un utilisateur va à une page, parfois des images montrent et parfois non. Si ce n'est pas le cas, et que la page est actualisée \ reloaded, l'image apparaît. Lorsque les images n'apparaissent pas, il s'agit parfois d'une image à laquelle l'utilisateur a déjà accédé auparavant.

Je suis perplexe.

Voici la balise img:

<img src="../somedir/image_script.php?i=1234"> 

Le fichier image_script.php où les chiffres pour obtenir l'image à partir, puis termine avec:

header("Content-type: image/jpeg"); 
if($from_db){ 
    print $image_blob; 
} else { 
    $im = imagecreatefromjpeg($image_file); 
    imagejpeg($im,null,100); 
    imagedestroy($im) 
} 

J'utilise PHP 5.2.8 sur IIS 6 en utilisant FastCGI. Il n'y a pas d'en-tête de cache sur le fichier image_script.php ni sur le répertoire dans lequel il se trouve. Actuellement, 99,9% des images sont basées sur des fichiers, donc je ne sais pas s'il y a une différence de résultat entre les images basées sur les fichiers. . Quand je vais directement à image_script.php dans mon navigateur, il renvoie l'image demandée (i = ????) 100% du temps.

a> Une idée de la raison pour laquelle le hit and miss avec les images affichées? et,

b> quelle serait la bonne façon de réellement mettre en cache les images servies par le script PHP? (Ils sont très statiques)

  • Scott

Répondre

1

Hmm. Vous ne pouvez pas dire avec certitude, mais peut-être votre imagecreatefromjpeg manque parfois de mémoire? Dans ce cas, vous diffusez un message d'erreur sous forme de données JPEG et ne le voyez jamais, n'est-ce pas? Par ailleurs, ne serait-ce pas simplement saisir le fichier image en tant que chaîne et le pelleter sans passer par imagecreatefromjpeg/imagejpeg/imagedestroy être plus efficace? On dirait que vous lisez un fichier JPEG, en créant une image mémoire interne de PHP, puis en le reconvertissant en JPEG (à une qualité de 100%) puis en diffusant ces données, quand vous pourriez simplement lire les données du fichier JPEG et imprimez-le, comme vous le faites depuis la base de données.

Que se passe si vous le faites, disons ...

... 
} else { 
    header ('Content-length: ' .filesize($image_file)); 
    readfile ($image_file); 
} 
+0

Matt, Excellente suggestion sur le readfile. J'étais tellement concentré sur l'ajout de la partie blob de la base de données que je me suis précipité la partie du fichier. Fonctionne très bien dans le test - J'ai besoin de le faire sur le serveur de production pour voir s'il résout le problème principal. – menkes

+0

Cool. J'espère que ça va aider; Si j'ai raison de manquer de mémoire de temps en temps, il devrait, comme le fichier readfile sera beaucoup moins gourmand en mémoire, ainsi que d'être plus léger sur le CPU. –