OVH Cloud OVH Cloud

comment determiner si l'on est sous environnement windows ?

17 réponses
Avatar
heulman
Bonjour,

Comment déterminer à coup sûr en php si l'on est sous environnement windows
?

Je pense utiliser la constante PHP_OS mais je m'interroge sur sa fiabilité.
Windows XP me retourne WINNT.
Est-ce toutes les versions de windows retournent une valeur commençant par
WIN ?

Peut-être existe-t-il une routine standard qui serait plus fiable ?

merci,
heulman

7 réponses

1 2
Avatar
Denis Beauregard
Le 01 Dec 2006 15:07:35 GMT, Michael DENIS
écrivait dans fr.comp.lang.php:

if windows
$chemin="C:mon_cheminwwwimagestest.jpg"
else //linux
$chemin="/home/www/images/test.jpg
}

on met

//définition des variables globales
if windows
$racine="C:mon_cheminwww"
$separ=""
else
$racine="/home/www/"
$separ="/"


Techniquement, dans Windows, / et sont équivalents dans le nom
d'un fichier. Donc, vous n'avez pas besoin de vous casser la tête
pour ce qui est des adresses **relatives**. Évidemment, pour les
adresses absolues et la casse, c'est autre chose. Il n'y a donc
pas lieu de créer la variable $separ.

Par ailleurs, j'indiquerais le chemin par rapport au nom du domaine
si c'est pour un site en ligne (mais le chemin réel si c'est pour
un script utilisé hors-ligne).

Vous pouvez donc développer sur Windows avec par exemple:

base/mapage.php avec un lien vers ../images/image.jpg
et cela fonctionnera sous Windows.

Il faut préciser que le / ou ne cause problème qu'en DOS.
Il y a plusieurs versions (DOS 3 ?), on pouvait changer le
SWITCH (quelque chose comme SET SWITCH="-"), sinon l'analyseur
de commandes suppose que le / est le commutateur des options.

dir /s xyz*.toto devenant dir -s xyz/*.toto

Mais ce n'est vrai qu'avec la ligne de commande. Les navigateurs
doivent faire la conversion si ce n'est pas Windows qui la fait.


Denis

Avatar
John GALLET
Techniquement, dans Windows, / et sont équivalents dans le nom
d'un fichier.


Accessoirement quand on a vraiment besoin de le faire, PHP définit la
constante ad hoc (DIRECTORY_SEPARATOR je crois ? J'ai la flemme d'aller
regarder dans le man). On n'a donc même pas à se poser la question.

Par ailleurs, j'indiquerais le chemin par rapport au nom du domaine
si c'est pour un site en ligne (mais le chemin réel si c'est pour
un script utilisé hors-ligne).


Dans tous les cas on s'en fiche, on doit toujours pouvoir donner la
possibilité à l'utilisateur (au sens : celui qui installe l'application,
ici) de mettre les choses là où il le veut, et donc on met un paramètre de
config dans un fichier (de config!) et on en parle plus.

A part pour utiliser des fonctionnalités spécifiques à un OS comme printer
sous windows ou les IPC sous unix, mais dont doit déjà déterminer la
disponibilité car ces extensions ne sont pas nécessairement
installées/compilées sur l'environnement local, ou si on veut jouer avec
setlocale (ce qui à mon sens est triplement problématique, mais libre à
chacun de faire ce qu'il veut), détecter la version de l'OS sur lequel
tourne PHP ne sert à rien. Ou plus précisement : ne devrait servir à rien
car on peut écrire du code totalement indépendant pour pas tellement plus
cher, ni en dev initial, ni en maintenance.

JG

Avatar
John GALLET
J'ai eu le cas sur un site que j'ai du reprendre en vitesse (pas le
temps de refaire tout le système) et déterminer l'OS me fut bien utile.


On est toujours/souvent obligé de faire n'importe quoi, au moins
temporairement, quand on récupère des trucs écrits avec les pieds, c'est
pas un scoop. Ca ne veut pas dire que c'est incontournable, et encore
moins à élever au pinnacle comme méthode standard de développement
(d'aucuns diraient comme "best practice" pour faire à la mode).

JG

Avatar
heulman
"Michael DENIS" a écrit dans le message de news:

Le 29 Nov 2006 10:55:34 GMT, CrazyCat
écrivait:

Je suis d'accord mais il y a toujours des exceptions, ne serait-ce que
lorsqu'on doit traiter des fichiers en utilisant les chemins physiques.


Non. Cet exemple en tous les cas rentre parfaitement dans le cas
expliqué par John. Au lieu de mettre quelquechose comme:

on met

//définition des variables globales
if windows
$racine="C:mon_cheminwww"
$separ=""
else
$racine="/home/www/"
$separ="/"
}


Et donc là le "if windows ... else ...." on le détermine comment ?

heulman


Avatar
John GALLET
Et donc là le "if windows ... else ...." on le détermine comment ?


On ne le détermine pas, c'est l'admin qui installe le biniou qui le gère,
ou plus précisement qui peut la surcharger si ce qu'on a mis par défaut ne
lui convient pas.

En prenant ici le cas des chemins :

Pour le choix de la valeur par défaut, ou on met une valeur relative (ce
qui est plus portable même sur un même OS, sinon on a du mal à faire
tourner plusieurs versions de la même application sur la même machine) ou
on met une valeur absole si justement on veut partager les données
(fichiers de config par exemple) et dans ce cas on commence par regarder
ce que PHP nous propose ou en lisant le manuel, ou en tentant sa chance
avec un script d'une ligne:

<?php print_r(get_defined_constants());?>
On trouve par exemple :
[DIRECTORY_SEPARATOR] => /
[PATH_SEPARATOR] => :
si on voulait jouer avec les chemins, ou par exemple :
[PHP_CONFIG_FILE_PATH] => /usr/local/php/lib

Si on ne trouve rien qui nous arrange et qu'on a *vraiment* (encore une
fois, j'insiste, ce besoin n'est PAS si courant que ça) de définir
explicitement un répertoire absolu du genre C:machinbidule (qui s'écrit
aussi C:/machin/bidule d'ailleurs) ou /usr/local/mon_app/ ) alors on met
dans le fichier de configuration :

// Choose your platform and installation path. Examples :
// cfg['mon_chemin_absolu']='/choose/absolute/path/';
// cfg['mon_chemin_absolu']='C:chooseabsolutepath';

cfg['mon_chemin_absolu']='/usr/local/mon_app/';

Et si besoin est, on livre des scripts d'installation, un .bat et un .sh,
qui se chargent de recopier le bon fichier, ou comme pour spip par
exemple, un script PHP qui fait saisir quelques valeur par un formulaire
et gère l'instalation. Les solutions ne manquent pas si on veut faire une
installation simplifiée/neuneu compliant.

a++;
JG

Avatar
Michael DENIS
Le 01 Dec 2006 17:16:08 GMT, Denis Beauregard
écrivait:

Techniquement, dans Windows, / et sont équivalents dans le nom
d'un fichier.


Exact. Et je ne suis même pas pardonnable car je teste sous Windows
avant de mettre en ligne sous Linux sans jamais rien changer. J'aurais
d'ailleurs peut-être dû parler de deux fonctions particulièrement
utiles pour la gestion des chemins:

$_SERVER['DOCUMENT_ROOT'] qui renvoie la racine du site et qui permet
des choses comme ça:
include($_SERVER['DOCUMENT_ROOT'] . "/include/mon_fichier.php");

$_SERVER['HTTP_HOST'] qui renvoie le domaine du serveur (qui peut être
127.0.0.1) et qui permet des choses comme ça:
echo "<img src="http://" . $_SERVER['HTTP_HOST'] .
"/images/mon_image.jpg" alt="mon image">";

--
Michaël DENIS


Déco? <http://www.toiles-de-mayenne.com/>

Avatar
John GALLET
Bonjour,

d'ailleurs peut-être dû parler de deux fonctions particulièrement
utiles pour la gestion des chemins:
$_SERVER['DOCUMENT_ROOT'] qui renvoie la racine du site et qui permet
des choses comme ça:
include($_SERVER['DOCUMENT_ROOT'] . "/include/mon_fichier.php");
$_SERVER['HTTP_HOST'] qui renvoie le domaine du serveur (qui peut être
127.0.0.1) et qui permet des choses comme ça:
echo "<img src="http://" . $_SERVER['HTTP_HOST'] .
"/images/mon_image.jpg" alt="mon image">";


Se méfier quand même de toutes ces belles variables, qui fonctionnent
comme elles peuvent dans certains cas (c'est à dire mal).

Exemple :

Tapons gentiment http://www.invalid.tld/~gallet/a.php/truc.php

Le fichier a.php existe bien dans ~gallet/ mais il n'existe pas de sous
répertoires et encore moins de truc.php nulle part dans l'arborescence.

Extrait de $_SERVER sous apache (pas d'url rewriting)
(
[DOCUMENT_ROOT] => /home/httpduser/www
[HTTP_HOST] => www.invalid.tld
[SCRIPT_FILENAME] => /home/gallet/www/a.php
[QUERY_STRING] =>
[REQUEST_URI] => /~gallet/a.php/truc.php
[SCRIPT_NAME] => /~gallet/a.php
[PATH_INFO] => /truc.php
[PATH_TRANSLATED] => /home/httpduser/www/truc.php
[PHP_SELF] => /~gallet/a.php/truc.php
)

Là dedans sont complètement faux ou inexploitables :

- le document root, étant donné qu'il donne celui du domaine et ne prends
pas en compte le user. Il est juste, mais on ne peut rien en faire.

- PATH_INFO : complètement à l'ouest.

- PATH_TRANSLATED : encore pire, il ne prend ni le bon user, ni le bon
script. Fête du slip totale.

- PHP_SELF : partiellement correct, mais bonjour le bazar.

Donc attention aux variables de $_SERVER, outre le fait qu'on peut leur
faire manger pas mal de choses (des ' au hasard...) elles ne sont pas
nécessairement fiables en contenu dans toutes les configurations.

a++;
JG

1 2