8791 sujets

Développement web côté serveur, CMS

bon dimanche à tous,

dans une telle définition, et sur un serveur local , y a t'il une préférence dans la façon de définir une
constante pour un site


if(!(defined(_BASEDIR_)))
    define(_BASEDIR_, "/var/www/site1");

// ou bien 
if(!(defined(_BASEDIR_)))
    define(_BASEDIR_, "http://www.votresite.com");


pour un site distant on comprend bien la différence , mais pour un localhost ??
il me semble qu'un accès 'direct' semble préférable (/var/....) car le parcours de recherche se fera sans passer par le réseau et donc gain de temps (j'ai bon ??? Smiley rolleyes )

une vrai différence !?
Modifié par kzone (05 Apr 2008 - 10:41)
bon dimanche,

ben ce sont en général 2 trucs differents BASEDIR et BASEURL
l'url servant au liens. c'est quand même plus logique. et je pense qu'au contraire il est preferable.

ne serait-ce que pour que dans tes liens n'apparaissent pas le detail de où est ranger ton serveur et de que type de systeme c'est.

mais pour certaines fonctions comme move_uploaded_file il te faut la BASEDIR avec le chemin sur le serveur sinon ça ne marche pas.
Modifié par CPascal (23 Mar 2008 - 12:07)
en fait j'utilise un 'tas' de définition dans un fichier php


// repertoire root
    if(!defined(_BASEDIR_))
		define(_BASEDIR_,"/var/www/html/");
	
	// reppertoire svg librairie
	if(!defined(_SVGLIBRARY_))
		define(_SVGLIBRARY_,"/var/www/html/svgLibrary/");
	
	// repertoire js librairie
	if(!defined(_JSLIBRARY_))
		define(_JSLIBRARY_,"/var/www/html/jsLibrary/");
		
	// repertoire image
	if(!defined(_IMAGES_))
		define(_IMAGES_,"/var/www/html/images/");
		
	// repertoire image svg
	if(!defined(_SVGIMAGES_))
		define(_SVGIMAGES_,"/var/www/html/images_svg/")


ce fichier est automatiquement 'chargé' pour tout le site via la variable du fichier
php.ini : auto_prepend_file = /chemin/vers/mon_fichier/conf.inc.php
ce qui me permet d'etre sur d'utiliser des valeurs définies et ce qu'elle que soit l'endroit ou elle sont appelées

a écrit :

... ne serait-ce que pour que dans tes liens n'apparaissent pas le detail de où est ranger ton serveur


c'est un peu ce que je me demandais niveau 'sécurité' .... mais par défaut, /var/www/ est le chemin sur les *nix il me semble , donc un secret de polichinel
Smiley ravi
mais je ne me suis jamais vraiment penché sur la sécurité de mon site ...
Smiley rolleyes

mais effectivement dans un lien <a href="_BASEDIR_.'mon_image.plouf'"> le fait d'utiliser une valeur de constante "/var/www/..." est -il 'dangereux' !??
Modifié par kzone (23 Mar 2008 - 12:43)
<a href="_BASEDIR_.'mon_image.plouf'">

ben en fait je me demande même si ça va marcher.... a tester. je n'ai plus de linux actuellement sur mes PC.

avec IE il faut precisez file:///c:\ un truc comme ça. le probleme de cette approche sous windows c'est que IE tous fichier ecris en direct va alors executer le fichier avec des droits beaucoup plus forts. les droits maximum. sous *nux tu ne dois pas avoir IE je sais pas.

edit
je me cite:
a écrit :
sous *nux tu ne dois pas avoir IE je sais pas


n'importe quoi mon pauvre pascal. bien sur c'est le client qui a IE ou FF ou autre chose. a ce que j'ai lu recement en bouquinant sur Ajax un lien direct est plus fort en droits sous IE. par contre opera est overblindé et c'est kif-kif.
Modifié par CPascal (23 Mar 2008 - 13:05)
si tu fais un

echo _BASEDIR_ ;

ou tout autre valeur définie dans les constantes , cela retourne (heureusement) la valeur attribuée dans les 'define',

mais c'est effectivement ta remarque faite quant à la sécurité d'un tel procédé que je me pose maintenant des questions (surtout que je viens de lire ton post sur l'hébergement local et les réponses de 'necromantik' et 'dew' ... (vu que j'héberge mon site en local depuis 2 ans avec un dyndns , des factures edf normal - il me semble - Smiley ravi , et par contre des heures passées à apprendre à configurer apache sql ... ce qui m'aurait a moins appris pas mal de truc ) ....

ps : tout le monde est parti chercher des oeufs bénis ..!?
Bonsoir,

tout d'abord un peut de lecture concernant les chemin dans la faq pour remettre les bases en place.

On notera que le chemin absolu sur le web n'est pas équivalent au chemin absolu sur le serveur. Il est donc techniquement pas possible d'utiliser la même valeur sauf si le "documentroot" du serveur est "/" (tout est publique donc... pas vraiment conseillé).

Ceci-dit l'utilisation de "http://www.votresite.com" peut marcher si "allow_url_fopen" est autorisé dans le fichier ini. Mais dans ce cas chaque fichier sera appelé via une requête à apache, processus extrêmement couteux en ressource et totalement inutile. En plus le résultat ne sera probablement pas celui escompté si le fichier porte l'extension .php.


Solution conseillée:
Définir dynamiquement le chemin absolu du fichier principal avec:
$chemin = dirname(__FILE__);

Puis construire les autres répertoires depuis cette valeur.
Il est également possible d'en déduire le chemin absolu sur le web en utilisant $_SERVER['DOCUMENT_ROOT'] (en admettant que ce dernier est contenu dans le chemin système).
necromantik a écrit :

$chemin = dirname(__FILE__);


j'ai envisagé également cette solution (en me basant sur des codes php du moteur smarty si je me rapelle bien ... ou bien Pommo ...)

jusqu'à maintenant j'utilisait la variable 'DOCUMENT_ROOT' du tableau $_SERVER comme tu en parles également , mais elle ne convenait pas dans tous les cas ...

Concernant la différence racine serveur et racine du site , j'avais bien compris la différence (même si parfois certains résultats me
surprennent encore) .

Comme j'utilise des templates 'maison' j'essaie au maximum de structurer le code pour avoir le moins de redondance dans mon code, tout en ayant pas à me soucier de quel endroit est appelée le script (ou page template) .

par contre j'ai remarqué que si je veux insérer un chemin dynamique dans un 'src' ou un 'href' je dois utiliser la syntaxe Url (ce qui après réflexion est plus que logique Smiley ravi ) , et avec un include les 2 sont possibles ...

mais comme il est dit sur php100 :

a écrit :

This expression - dirname(__FILE__) - is used in a real lot of places. The reason is simple - libraries want to include files relative to library top directory, and do not want to count on include path. And relative include resolution rules in PHP not clear to all, so people prefer to be sure. The downside here is that this expression is dynamic - executed at run-time. Meaning it’s slower and less toolable and also makes a bad habit of putting dynamic things into include (which is not a problem here, since it’s “static dynamic” thing, but still a bad habit).


la solution des constantes d'environnement est elle décrite dans la faq php de developpez.com
il proposait également une définition de constante pour la racine du site selon son Uri ( http:// ....) avec auto_pepend_fil pointant ve un fichier de config
a écrit :

This expression - dirname(__FILE__) - is used in a real lot of places. The reason is simple - libraries want to include files relative to library top directory, and do not want to count on include path. And relative include resolution rules in PHP not clear to all, so people prefer to be sure. The downside here is that this expression is dynamic - executed at run-time. Meaning it’s slower and less toolable and also makes a bad habit of putting dynamic things into include (which is not a problem here, since it’s “static dynamic” thing, but still a bad habit).

Je penses que cette personne a faux sur toute la ligne.
L'idée derrière l'utilisation de dirname(__FILE__) est de faire un code portable. Dans ce cas on part du principe que l'on ne connaît pas le chemin absolu vers le script, il est donc impossible de le coder en dur dans l'include_path ou dans une constante.
Pourquoi ne pas utiliser le chemin relatif dans l'include alors ? Tout simplement parce que celui-ci est relatif au fichier exécuté et non au fichier courant, ce qui signifie que si quelqu'un souhaite intégrer notre script dans un autre toute l'architecture est par terre.

Ensuite reste le choix d'utiliser une constante ou ajouter dynamiquement notre chemin à l'include_path (ou l'écriture à chaque include mais ça effectivement c'est stupide). La deuxième solution est plus lente mais elle présente l'avantage d'être plus propre.

Quand à dire qu'il ne faut pas mettre de variable dans un include, oui et non. Certes c'est un risque et la plupart des gens qui le font ne prennent aucune précaution (nombreux exemples sur ce forum). Cependant si l'on veut faire une application un tantinet avancée cela devient vite indispensable et si l'on prend la peine de sécuriser les variables utilisées il n'y a pas de problèmes.


Pour $_SERVER['DOCUMENT_ROOT'] je ne disais pas de l'utiliser comme chemin absolu système mais pour déterminer le chemin absolu sur le web.
Exemple:

$cheminSys = '/var/www/site1/truc/monphp/';
$_SERVER['DOCUMENT_ROOT'] = '/var/www/site1/';
Dans ce cas:
$cheminWeb = '/truc/monphp/';
(différence des deux)

Cela marche dans la plupart des cas, sauf si le fichier se trouve hors de la zone accessible par le web.



À propos de l'utilisation d'une URL dans un include, je le répète, c'est extrêmement lent, coûteux et surtout parfaitement inutile si le script est sur la même machine. Voir la documentation php à propos d'include pour les mécanismes d'inclusion de fichiers distants.


PS: après avoir lu l'article complet que tu cite, je penses toujours qu'il a tord par rapport aux raisons de l'utilisation d'un tel mécanisme (il semble sous-entendre que c'est par manque de connaissance du php). Par contre sa proposition de constante __FILEDIR__ est intéressante.
bonjour et désolé Necromantik pour ma réponse tardive ...

trop peu de temps pour le moment pour mes loisirs en Php ...
Je te remercie pour toutes tes indications et précieux conseils .

Il me reste beaucoup à apprendre Smiley cligne et surtout faire et refaire des exos ...
Toujours envie de faire un code propre et optimal !

Necromantik a écrit :

Tout simplement parce que celui-ci est relatif au fichier exécuté et non au fichier courant, ce qui signifie que si quelqu'un souhaite intégrer notre script dans un autre toute l'architecture est par terre.


c'est effectivement une excellente raison

tout cela m'a bien éclairci les idées .... ehhh je crois Smiley langue