Meilleure façon de mettre en cache les images redimensionnées en utilisant PHP et MySQL
Quelle serait la meilleure pratique de la façon de gérer la mise en cache des images à l'aide de PHP.
Le nom de fichier sont stockées dans une base de données MySQL qui est renommé pour un GUID sur le téléchargement, ainsi que le nom de fichier d'origine et la balise alt.
Lorsque l'image est mise en pages HTML, il est fait à l'aide d'une url de la forme '/images/obtenir/200x200/{guid}.jpg qui est réécrit à un script php. Ce qui permet à mon concepteurs de spécifier (grossièrement, à la source de l'image peut-être la plus petite), la taille du fichier.
Le script php, puis crée une table de hachage de la taille (200x200 dans l'url) et le GUID nom de fichier et si le fichier a été généré avant (fichier avec le nom de la table de hachage existe dans le répertoire TMP) envoie le fichier à partir de l'application répertoire TMP. Si le haché le nom de fichier ne existe pas, il est créé, écrit sur le disque et servi de la même manière,
Est ce efficace qu'elle pourrait l'être? (Il prend également en charge les images de filigrane et de la fonction de filigrane paramètres sont stockés dans la table de hachage, mais c'est hors de portée pour cela.)
source d'informationauteur Chris Hawes | 2008-09-26
Vous devez vous connecter pour publier un commentaire.
Il y a deux fautes de frappe dans Dan Udey de réécriture de l'exemple (et je ne peux pas commenter sur elle), elle devrait plutôt être :
Ce qui concerne.
Je voudrais le faire d'une autre manière.
Problèmes:
1. Avoir PHP servir les fichiers est moins efficace qu'il pourrait l'être.
2. PHP doit vérifier l'existence de fichiers chaque fois qu'une image est demandée
3. Apache est de loin préférable à ce que PHP ne le sera jamais.
Il y a quelques solutions ici.
Vous pouvez utiliser
mod_rewrite
sur Apache. Il est possible d'utiliser mod_rewrite pour tester si un fichier existe, et si oui, servir de ce fichier à la place. Cela contourne PHP entièrement, et qui rend les choses beaucoup plus rapidement. La vraie manière de le faire, cependant, serait de générer une URL spécifique schéma qui doit toujours exister, et ensuite rediriger vers PHP si ce n'.Par exemple:
Donc, si un client demande
/images/cached/<something>
et que le fichier n'existe pas déjà, Apache va rediriger la demande vers/images/generate.php?/images/cached/<something>
. Ce script peut ensuite générer l'image, de l'écrire dans le cache, et puis de l'envoyer au client. Dans l'avenir, le script PHP n'est jamais appelé à l'exception des nouvelles images.Utiliser la mise en cache. Comme une autre affiche dit, l'utilisation des choses comme
mod_expires
de Dernière modification des en-têtes, etc. pour répondre à conditionnelle requêtes GET. Si le client n'a pas à re-demande, les images, le chargement de la page va accélérer de façon spectaculaire, et la charge sur le serveur sera en baisse.Pour le cas où vous n'avez qu'à envoyer une image à partir de PHP, vous pouvez utiliser
mod_xsendfile
de le faire avec le moins de frais généraux. Voir l'excellent blog de Arnold Daniels sur la question, mais remarque que son exemple est pour les téléchargements. Pour servir d'images en ligne, de prendre de l'-tête Content-Disposition (le troisième en-tête ()).Espère que cette aide - plus après ma migraine s'éclaircit.
Une remarque vaut la peine d'ajouter est pour vous assurer que le code ne génère pas de "non autorisée" taille de ces images.
Donc l'URL suivante permettra de créer un 200x200 version de l'image de 1234 si l'un n'existe pas déjà. J'avais très vous suggérons assurez-vous que l'URL demandée contient les dimensions de l'image que vous soutenez.
Une personne malveillante pourrait commencer à demander aléatoire Url, toujours modifier la hauteur & largeur de l'image. Ce serait la cause de votre serveur à de nombreux problèmes, b/c il sera assis là, essentiellement sous l'attaque, générer des images de tailles que vous ne supportez pas.
Voici un hasard capture de code illustrant cela:
Me semble excellent post, mais mon problème est toujours pas résolu. Je n'ai pas accès à htaccess dans mon hébergeur, donc pas question de apache peaufinage. Est-il vraiment un moyen de définir cace en-tête de contrôle pour les images?
Votre approche semble tout à fait raisonnable - je voudrais ajouter qu'un mécanisme devrait être mis en place afin de vérifier que la date de la version en cache a été généré était après la dernière modification horodatage de l'origine (source) du fichier image et si pas de régénérer le cache/version redimensionnée. Cela permettra d'assurer que si une image est modifiée par les concepteurs du cache sera mis à jour en conséquence.
Qui sonne comme un solide moyen de le faire. L'étape suivante consiste à aller au-delà de PHP/MySQL.
Peut-être, modifiez vos en-têtes de:
Si vous êtes à l'aide de PHP pour envoyer des types MIME, vous pouvez aussi utiliser "Keep-alive" et "Cache-control" en-têtes pour prolonger la vie de vos images sur le serveur et de prendre une partie de la charge hors de PHP/MySQL.
Aussi, envisager de apache plugin(s) pour la mise en cache. Comme mod_expires.
Oh, encore une chose, quel contrôle avez-vous sur votre serveur? Doit-on limiter cette conversation à juste PHP/MySQL?
J'ai réussi à le faire simplement en utilisant une redirection header en PHP:
Au lieu de garder l'adresse du fichier dans la base de données, je préfère l'ajout d'un nombre aléatoire pour le nom de fichier à chaque fois que l'utilisateur se connecte. Quelque chose comme ceci pour l'utilisateur 1234: image/picture_1234.png?rnd=6534122341
Si l'utilisateur soumet une nouvelle image au cours de la session, j'ai juste actualiser le nombre aléatoire.
GUID aborde le problème du cache de 100%. Cependant il lui est plus difficile de garder une trace des fichiers image. Avec cette méthode il y a une chance que l'utilisateur peut voir la même image à nouveau lors d'une prochaine connexion. Cependant, les chances sont faibles si vous générez votre nombre aléatoire à partir d'un milliards de chiffres.
phpThumb est un cadre qui génère des images redimensionnées/vignettes à la volée. Il met également en œuvre la mise en cache et il est très facile à mettre en œuvre.
Le code pour redimensionner une image:
vous donnera une miniature de 200 x 200;
Il prend également en charge le filigrane.
Check it out:
http://phpthumb.sourceforge.net/