Aller au contenu

Afficher images avec chemin serveur absolu ?


Sujets conseillés

Posté

Bonjour à tous,

Je suis confronté au problème suivant (je précise que je suis sur un serveur dédié qui héberge de nombreux sites) :

Sur un site, j'ai besoin d'afficher des images qui se trouvent dans un répertoire correspondant à un autre site (donc au-dessus de la racine du site). En clair, mon image se trouve dans le répertoire

/home/SITE1/domains/site1.com/public_html/images/image.png

et je dois afficher cette image sur une page qui se trouve dans le répertoire

/home/SITE2/domains/site2.com/public_html/index.php

Pour exécuter des fonctions PHP sur le fichier image (comme getimagesize), ça ne pose pas de problème d'utiliser le chemin absolu (/home/...)

Par contre, pour afficher l'image avec

<img src="/home/SITE1/domains/site1.com/public_html/images/image.png">

ça ne marche pas !

Je sais que je pourrais utiliser le chemin HTTP en faisant

<img src="http://www.site1.com/images/image.png">

mais l'objectif est précisément de ne pas surcharger Apache, car ce type d'opération est effectué des milliers de fois sur un grand nombre de sites, et du coup mon serveur rame complètement. Je souhaiterais donc pouvoir faire un accès direct au fichier, sans passer par HTTP.

J'ai tourné le problème dans tous les sens, ça refuse de fonctionner !

Merci d'avance de vos pistes !

Jean-Luc

Posté

Bonjour,

Par contre, pour afficher l'image avec

<img src="/home/SITE1/domains/site1.com/public_html/images/image.png">

ça ne marche pas !

Je sais que je pourrais utiliser le chemin HTTP en faisant

<img src="http://www.site1.com/images/image.png">

mais l'objectif est précisément de ne pas surcharger Apache, car ce type d'opération est effectué des milliers de fois sur un grand nombre de sites, et du coup mon serveur rame complètement. Je souhaiterais donc pouvoir faire un accès direct au fichier, sans passer par HTTP.

Il n'y a aucune différence de charge serveur entre les deux types d'affichage. La conversion de /images/image.png en http://www.ton_site.com/images/image.png est faite par le navigateur et non par le serveur.

Jean-Luc

Posté

De plus, un navigateur ne pourra jamais afficher un chemin serveur qui lui est caché : tes réglages serveur vont faire que ton domaine pointera sur "/home/SITE1/domains/site1.com/", et nulle part ailleurs.

Posté

En fait, je n'en fais pas grand chose si ce n'est les afficher, et éventuellement en déterminer la taille.

Par contre, une même photo est affichée sur de nombreux sites distincts, alors qu'elle est stockée dans un seul répertoire.

J'imagine donc qu'il doit y avoir des solutions pour réduire la charge de mon serveur ?

Posté

Non non, c'est pour chaque image. Toutes images confondues ça doit faire plusieurs dizaines de milliers par jour.

Posté

C'est un dédié 4 coeurs et 8 Go de RAM. Mais c'est vrai qu'il y a beaucoup de sites dessus (plus de 1000). Et vu que le contenu de la plupart des sites utilise une base de données partagées, ainsi que des images partagées, je me dis qu'il y a quelque chose à faire pour réduire la charge, qui devient critique depuis quelques semaines.

Posté

Tu es certain que ce sont les appels images qui sont responsables de ta charge serveur ?

Parce qu'à priori ça ne devrait impacter que la bande passante.

Tu peux me donner plus de précisions sur les traitements que tu fais pour déterminer leurs tailles ?

Posté

A vrai dire, je ne suis certain de rien...

Pour la taille, j'utilise un filesize. Par contre il y a aussi une fonction de création d'un filigrane (donc des getimagesize, imagecreatefromjpeg, imagettftext et imagejpeg).

Maintenant je ne certifie pas que les images soient la cause principale de la charge, par contre c'est vrai qu'il y a énormément d'images qui s'affichent en permanence.

Posté

Ha, le filigrane peut être à l'origine de tout ça, si tu le fais à la volée !

Il ne te reste plus qu'à mettre les images générées par GD en cache, tu allègeras déjà pas mal ton serveur.

Posté

Oui, il est effectivement fait à la volée :(

Pour la mise en cache, ça se fait via un module Apache spécifique ?

Posté
A vrai dire, je ne suis certain de rien...
Utiliser des fonctions qui traitent des images est beaucoup plus lourd pour le serveur que le simple affichage de ces images.

Pour le reste, si tu veux optimiser les choses, il faut commencer par comprendre. Sans cela, ce n'est pas de l'optimisation, mais un jeu de hasard. :whistling:

Jean-Luc

Posté
Pour la mise en cache, ça se fait via un module Apache spécifique ?

Pas nécessairement, mais faudra mettre un peu les mains dans le cambouis.

Personnellement, si tes images sont toutes dans le même répertoire, je ferais une règle de redirection qui les renverrait toutes vers un fichier unique.

Ce fichier vérifierait l'existence d'une image retravaillée dans son répertoire de cache.

Si elle n'est pas présente, il la crée avec le filigrane et m'enregistre.

Ensuite, il affiche le contenu de l'image du cache.

A part la règle de réécriture, qui dépendra vraiment de l'organisation de tes répertoires, ça n'a rien de sorcier.

Posté

Je suis d'accord avec toi, mais même si on sait que telle ou telle fonction utilise davantage de ressources, il n'est pas évident de déterminer, à partir d'une charge serveur donnée, quelle est l'origine exacte d'une surcharge, d'autant que les paramètres sont nombreux et évolutifs...

Et tant que tout va bien, on se pose moins de questions... notamment dans l'utilisation des fonctions dont on a besoin.

Posté

Pas de problème pour le cambouis...

Je vais étudier cela, sachant que les images ne sont pas toutes dans un même répertoire, loin de là même ! C'est du genre clients/1234/annonce/123456/... donc en gros des milliers de répertoires. Le plus simple serait donc peut-être de créer l'image "filigranée" en même temps que l'upload de l'image... et ce serait uniquement cette image qui serait utilisée ?

Posté

Salut Jean-Luc,

Tu ne m'avais nullement cité le fait que tu créais un filigrane à la volée :)

Ne cherche pas plus loin... ton problème vient de là !

Posté

En effet, j'avais complètement oublié... et en effet, la mise en place correspond à peu près à l'augmentation plus régulière de la charge !

Je suis en train de faire une modif, afin que le filigrane ne soit créé qu'une seule fois, lors du premier affichage de chaque photo. La contrepartie, c'est que ça va augmenter sensiblement l'espace disque, car j'enregistre les photos filigranées... et j'ai un filigrane pour chaque langue, donc en tout 7 photos à la place d'une seule ! Mais bon, j'ai de la marge donc ça va.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...