Jelix 1.0RC2, incohérences de PHP...
Par Laurentj le jeudi, janvier 3 2008, 11:15 - Projets - Lien permanent
J'ai sorti hier soir une deuxième version candidate pour Jelix 1.0, corrigeant quelques bugs. Les plus embêtants d'entre eux sont dû, non pas à Jelix à proprement parler, mais à des incohérences dans PHP.
L'une de ces incohérences, c'est le contenu de la variable $_SERVER. Je savais qu'il y avait quelques différences entre l'utilisation de PHP avec Apache, et l'utilisation de PHP avec IIS, mais là, j'ai découvert une vérité beaucoup plus débile.
Vous voulez par exemple récupérer le PATH_INFO (la partie du chemin qui se trouve derrière le nom du script). Selon la plateforme ou la manière d'utiliser PHP (en module apache, cgi ou suphp entre autres..), pour une même url, vous n'aurez jamais la même valeur dans $_SERVER['PATH_INFO']. Et il en va de même pour $_SERVER['SCRIPT_NAME'], $_SERVER['SCRIPT_FILENAME'], $_SERVER['PHP_SELF'], ou encore $_SERVER['ORIG_PATH_INFO'], $_SERVER['ORIG_SCRIPT_NAME'] etc.. Ajoutez à cela que sur une même plateforme (en cgi ou suphp), ces valeurs changent aussi en fonction du paramètre de configuration cgi.fix_pathinfo et c'est l'horreur...
En clair, pour faire un script ayant besoin des valeurs se trouvant (en théorie) dans $_SERVER, et qui soit portable sur toutes les plateformes sans interventions de l'utilisateur, c'est quasiment impossible à faire. En fait, les informations dans $_SERVER sont pratiquement inutilisables. Une grosse connerie quoi. Une abération de plus dans PHP parmis tant d'autres. Même si les informations délivrées sont différentes d'un serveur à un autre, le moteur de PHP ne pourrait-il pas faire en sorte qu'on ait les informations attendues dans $_SERVER ? J'ai l'impression que les développeurs des connecteurs SAPI ne se sont pas mis d'accord sur une homogénéisation du contenu de $_SERVER (m'enfin vu l'organisation pourrie du dev du moteur PHP, ça ne m'étonne pas).
J'arrive toutefois dans Jelix à "deviner" dans quel variable de $_SERVER je peux récupérer les données dont j'ai besoin pour "calculer" le PATH_INFO, mais ce n'est pas un processus fiable à 100%, puisque je n'ai pas la possibilité d'avoir sur mes bécanes toutes les configurations et serveurs web possibles et imaginables. J'ai donc ajouté pour les cas "foireux" une solution de "secours", utilisée par d'autres frameworks, qui est d'avoir un paramètre dans la configuration de Jelix, où l'on peut indiquer le nom de la variable de $_SERVER dont jelix a besoin.
Autre incohérence trouvée : des changements de comportement, ou plutôt des bugs de regressions je dirais, dans la fonction filter_var. Il y a par exemple le flag FILTER_FLAG_SCHEME_REQUIRED qui n'est plus pris en compte dans la dernière version de PHP. Ce qui fait que des tests unitaires de Jelix passent avec certaines version de PHP, et pas avec d'autres. Donc je ne peux pas utiliser filter_var pour valider des urls et suis obligé de faire cette validation "à la main". Super :-/
Commentaires
C'est normal, les données $_SERVER* ne viennent pas de PHP mais bien du serveur qu'il utilise. Ces données, peuvent être aussi "hackable". Utilise FILE
__FILE__ ne me donne pas le pathinfo hein... juste le nom du fichier php courant. Ce qui n'a aucun rapport avec l'url appelée. De plus, si je suis dans un include, ce n'est pas le path du fichier appelé par le serveur.
Que $_SERVER vient du serveur ou pas, j'en ai rien à fiche (d'un point de vue du developeur). PHP devrait fournir des infos correctes et cohérentes (dans $_SERVER ou ailleurs), point.
Hello, je sais que ça serait fouiner chez la concurrence, mais jette un oeil sur une instance Zend_Controller_Request. On dispose d'une var baseurl. qui soustraite au request_uri te donne le path (pas juste ce qui suis le domaine.. Dans le cas ou ton site est dans un dossier)
Autre solution : j'ai rien compris et je suis a la ramasse? :)
@michael : Oui, une fois qu'on a le baseUrl et la bonne requestUri, on fait déjà pas mal de chose. Mais si tu regardes bien ZF, justement, c'est la récupération de baseUrl et requestUri qui pose problème. ZF fait comme tout les autres frameworks : il est obligé de scruter une multitude de variable $_SERVER pour trouver le baseUrl et le requestUri qui n'est pas toujours dans
$_SERVER['REQUEST_URI']justement.. (voir dans Library/Zend/Controller/Request/Http.php les méthodessetBaseUrletsetRequestUri). Bref, on emploi tous à peu prés les mêmes bidouilles infâmes...Une petite différence pour Jelix : cette "divination" ne se fait qu'au premier démarrage de l'appli, jelix stockant l'information de où il a trouvé les infos, dans le fichier de config "compilé".