2010-06-05 6 views
0

Hé les gars actuellement je pense à servir des images en utilisant un script gestionnaire d'image. J'ai deux sources d'images. L'un provient de mon dossier d'images Web où sont servies les images utilisées pour construire l'interface de mon site. L'autre est dans chaque dossier d'images d'utilisateurs où ils peuvent stocker leurs propres images. Je pensais donner à chaque image d'utilisateur un identifiant unique et ensuite chercher cet id avec le script de gestionnaire d'image et servir l'image, et changer le nom de fichier. Le problème est que mon dossier d'images de site n'a aucune information dans la base de données et n'a donc aucun ids, devrais-je juste servir directement? De même, cette façon de servir les images des utilisateurs ne semble pas être la plus efficace. Si quelqu'un a des suggestions, je l'apprécierais vraiment.Qu'est-ce qu'un moyen efficace de servir des images (PHP)?

$sql="SELECT username,file_name FROM images WHERE id=?"; 
$stmt=$conn->prepare($sql); 
$result=$stmt->execute(array($ID)); 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
$image_name = $row['file_name']; 
$username = $row['username']; 
} 

$path="$username/images/$image_name"; 


header("Expires: -1"); 

header("Cache-Control: no-store, no-cache, must-revalidate"); 

header("Cache-Control: post-check=0, pre-check=0", false); 

readfile($path); 
+0

Vous devez ajouter un traitement des erreurs à votre script. Que faire si aucun enregistrement ou le fichier correspondant n'est trouvé? – Gumbo

Répondre

2

La manière la plus évidente et efficace de renoncer à PHP et de le laisser être directement servi par Apache, avec la mise en cache. Y a-t-il une raison pour laquelle vous devez garder une trace des images de cette façon que vous ne pouvez pas faire simplement en analysant access_log après le fait? Et pourquoi pas de mise en cache, je suppose qu'une nouvelle image obtient un nouvel identifiant unique, pas un ancien refait? Cela étant dit: si vous avez besoin de récupération de base de données & servez-le avec php, il est à peu près aussi efficace que vous pouvez obtenir, bien que soyez très en guerre des dossiers nommés par noms d'utilisateur, un problème de sécurité possible. Peut-être mettre en cache le résultat de la requête quelque part dans memcached ou similaire, c'est à peu près tout.

+1

Ajouter: Commentaire @Matthew Flaschen sur un serveur statique seulement est en effet un bon si étiré pour les ressources. Même sur le même serveur, un processus LightHTTPD ou Apache séparé (dépouillé de tous les modules) peut faire beaucoup de différence. – Wrikken

+0

donc fondamentalement faire ce que je fais? Que recommanderiez-vous de faire pour les images de sites Web comme les boutons et autres où il n'y a pas d'informations de base de données si je devais servir directement à partir d'un dossier sans gestionnaire? – Scarface

+1

@Scarface, je pense qu'il vaut la peine de mentionner le serveur nginx. Vous pouvez l'utiliser comme un proxy inverse, donc il servira toutes les images statiques du site web et votre serveur Apache ne saura même pas que l'utilisateur les a demandés. –

3

La façon la plus efficace pour servir des images est d'avoir tous sur une seule statique cookie-free domain séparée. C'est ainsi que fonctionnent les sites comme Flickr. Tout ce que vous avez besoin de stocker dans la base de données est suffisant pour construire l'URL statique.

+0

C'est ce que je pensais, mais étant donné que je n'ai pas encore cette capacité, recommanderiez-vous de servir chaque image comme je le fais et comment devrais-je servir les images de mon site web comme l'en-tête et les boutons? – Scarface

+1

Il ne doit pas nécessairement être un serveur physique distinct. Un deuxième hôte virtuel est plus que suffisant. –

+0

@Scarface, je ne voudrais certainement pas exécuter tout le contenu statique via PHP. Frank a raison de dire que vous pouvez utiliser un hôte virtuel distinct même si vous n'avez qu'un seul serveur physique. –

3

La manière la plus efficace de servir les images est de ne pas utiliser PHP du tout. Laissez votre serveur Web servir les images directement à partir du disque. Ils finissent par être mis en cache par Linux de toute façon, donc c'est très rapide. Plusieurs fois plus vite que tout ce que vous pouvez faire en PHP. Chargez firebug et essayez-le vous-même. Regardez combien de temps il faut à Apache pour retourner une image à partir du disque, par rapport à votre script (je l'ai fait il ya un an, avec un script similaire qui a utilisé readfile()). La différence est significative. Si vous utilisez un testeur de charge comme ab ou httperf, vous verrez probablement une différence encore plus grande dans les demandes par seconde.

Il y a toujours X-Sendfile, que certains serveurs http supportent.

Alternativement, envisager de mettre un proxy inverse de la mise en cache comme vernis devant votre script, de sorte que vous êtes au moins

+0

faire directement à partir du disque, mais je veux rendre plus difficile pour les robots et les utilisateurs malveillants de trouver ce contenu et télécharger tout ce qui mettrait une pression sur mon serveur alors je pensais juste de mélanger les noms de fichiers et de servir de script php n'est pas affiché. Votre chemin pourrait-il protéger de cela? – Scarface

+0

pourriez-vous peut-être mettre un exemple, je ne suis pas exactement sûr de ce que vous voulez dire – Scarface

+0

nginx, lighttpd, et vernis peuvent tous servir des milliers de demandes d'images par seconde sans mettre une pression sur votre serveur. Si quelque chose, je serais plus préoccupé par la bande passante. Comment voulez-vous exactement qu'un script php empêche les robots de demander vos images? image.php? id = 123 est aussi facile à demander que /images/123.jpg –

0

Je ne suis pas sûr que je comprends ce que votre problème est que, dans vos modèles, au lieu de :

<img src="image_handler.php?id=123" /> 

vous devez écrire:

<?php 
    $file_data = get_file_data(123); 
?> 
<img src="<?php echo $file_data['user_name'], "/images/", $file_data['image_name']; ?>" /> 

Et ne pas oublier d'échapper à vos données.

Vous ne devriez pas servir vos fichiers avec PHP. De plus, vous devriez trouver un hébergeur qui vous offre Apache et lighttpd ou nginx. Apache n'est pas très rapide quand il s'agit de servir des fichiers statiques.

Questions connexes