PHP langage Multiplateforme ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : PHP langage Multiplateforme ?

Re: PHP langage Multiplateforme ?

par Jeanphi » 08 août 2012, 14:36

Que de possibilités! Merci pour votre aide. Je les retiens toutes deux. J'aime beaucoup le principe de getcwd(). Je me méfie un peu d'un include_path si plusieurs fichiers portent le même nom en deux endroits de l'arborescence (on ne sait plus lequel est choisi en premier, et on galère si on veut le deuxième).

Re: PHP langage Multiplateforme ?

par Mazarini » 08 août 2012, 09:08

Bonjour,

Pour tout ce qui est include et fonctions semblable, le plus simple est de se reposer sur l'include_path qui permet de rechercher les fichiers dans un ou plusieurs répertoires paramétrer.

Une autre possibilité est de stocker dans une constante les répertoires utiles à l'application et d'utiliser cette constante pour les accès.

Re: PHP langage Multiplateforme ?

par Hywan » 07 août 2012, 23:16

Hello,

Tu peux écrire du code PHP indépendant de la plateforme. Après tout, on utilise rarement des commandes systèmes (parce que c'est lent d'une part et parce que c'est très particulier d'autre part).

Écrire DIRECTORY_SEPARATOR est un peu long. Souvent on utilise l'alias suivant :
define('DS', DIRECTORY_SEPARATOR);
Et hop, tu pourras utiliser DS.

Enfin, si tu veux écrire des chemins absolus, tu peux utiliser la fonction getcwd() (get current working directory), équivalente de pwd si tu fais du système. Ça te donnera le chemin du fichier couramment exécuté, et non pas du fichier dans lequel tu es (sauf si c'est celui qui est exécuté ;)). Par exemple :
// /tmp/test/index.php
require 'a/b/c/d.php';

// /tmp/test/a/b/c/d.php
echo getcwd(), "\n";
Si tu exécutes index.php, tu auras /tmp/test normalement. Ça va te permettre de construire des chemins absolus.
Sinon, tu peux aussi regarder du côté de realpath().

Re: PHP langage Multiplateforme ?

par Jeanphi » 07 août 2012, 18:13

Merci pour vos réponses!

Ryle, je comprends parfaitement ta définition de "multi-plateforme", même si la commande système est un cas un peu particulier. J'aimerais développer proprement en PHP, de manière indépendante de la machine qui supporte l'application, mais c'est visiblement sans espoir.

Hyman, j'essaierai dès demain DIRECTORY_SEPARATOR, car je me retrouve sur le nouveau serveur web IIS déployé par mon administrateur bureautique, avec des chemins mêlant \ (issus de la variable $_SERVER['ROOT_DIRECTORY'] ) et des / codés dans l'application PHP. Sur l'ancien serveur IIS (dont je n'étais pas administrateur non plus), cela fonctionnait très bien sans que je m'en soucie. A moins d'indiquer à mon administrateur bureautique ce qui ne va pas dans la configuration du serveur, il faut que j'adapte le code.

Sirakawa, quelque chose m'interpelle : pourquoi je ne parviens pas à créer mes propres chemins absolus dans mon application PHP ? Il semble que j'aie toujours besoin de connaître le vrai PATH de la machine sur laquelle mon appli PHP est installée (ex : C:\www\mon_appli ) et la compléter par l'arborescence de mon appli pour que cela fonctionne, à moins de mettre des chemins relatifs (ex : ../../config/config.php), et je ne trouve pas cala très beau. D'après ce que je lis un peu partout, en écrivant "/répertoire/fichier", le serveur PHP devrait comprendre que je suis dans le root directory de mon application PHP, non ?

Re: PHP langage Multiplateforme ?

par sirakawa » 04 août 2012, 12:27

Autre façon de dire la même chose:
Le code purement PHP sera toujours exécuté, et c'est bien pour cette raison qu'il existe, heureusement, une commande PHP qui fait le boulot pour la majorité des fonctions de fichiers d'un système, mais curieusement, ni ls d'Unix, ni dir de Dos.

Mais c'est vrai que, par exemple, exec ("mysqldump") fonctionnera sous unix, alors que je ne suis pas sûr qu'il ne faille pas passer exec("mysqldump.exe") pour que ca fonctionne chez micromou.
Ça aboutit à du php qui fait parfaitement son boulot, mais dont il faut prévoir quelque chose du genre
function dumpe (parametres)
{
   switch (PLATE_FORME) // constante définie par ailleurs
   {
        case "WIN":
       break;
      case "NUNUX":
       break;
   }
}

Re: PHP langage Multiplateforme ?

par Ryle » 04 août 2012, 11:57

En complément de ce qui a déjà été dit, j'ajouterais simplement que Multiplateforme pour un serveur ne signifie pas nécessairement compatibilité des applications qui seront déployées dessus.

Par exemple, la commande exec() te permet de demander l’exécution d'une commande par le système, que celui-ci soit sur un noyau Windows, Linux ou autre. Cependant si dans ton code tu demandes l'exécution de la commande "ls" (permettant de lister le contenu d'un répertoire sous linux) sur un serveur windows, il te répondra que la commande que tu veux exécuter est inconnue, car la plateforme windows utilise l'instruction "dir". PHP n'en reste pas moins capable de faire exécuter une commande à l'une ou l'autre des plateformes :)

Re: PHP langage Multiplateforme ?

par sirakawa » 04 août 2012, 10:31

C'est marrant que cette question fasse ressurgir une vieille discussion sur le code compilé.

Si mes souvenirs sont bons, en indiquant à php des chemins à la mode Unix, il les retrouve sur une machine DOS:
/chemin est compris par php windaube comme \chemin

Ne me mettez pas sens dessus dessous, si je m'ai trompetté.

Re: PHP langage Multiplateforme ?

par Hywan » 03 août 2012, 18:05

Tu peux utiliser la constante DIRECTORY_SEPARATOR, mais note que les dernières versions de Windows supportent aussi bien le slash que le backslash.

Re: PHP langage Multiplateforme ?

par Jeanphi » 03 août 2012, 17:50

Bonjour,

je suis plutôt novice en PHP, mais je me pose la question suivante :
si PHP est multi plate-forme, comment ça se fait que je cherche désespérément une solution simple pour gérer les chemins de mes fichiers, qui sont différents sous Linux et sous Windows ? Et ce, à cause du slash (/) sous Linux, et de l'antislach (\) sous Windows.

Merci de m'éclairer.

par stopher » 23 janv. 2009, 19:41

Merci pour cette mise au point , claire est précise ...

une subtilité qui n'est pas toujours évidente à mettre en avant ... la preuve ... :D

par Hywan » 23 janv. 2009, 19:15

Hey :),

Il faut remettre quelques pendules à l'heure je pense.

Par abus de langage (sans mauvais jeu de mot), quand on parle de compilation c'est toujours « en langage machine », mais on peut compiler pour autre chose. La compilation c'est juste le fait d'analyser (lexicalement et syntaxiquement) un code et de le transformer dans un autre code.
Partant de ce postulat, C/C++ est compilé, Java aussi, mais PHP également ! À votre avis, comment PHP s'exécute au final ? Il est transformé dans un byte code que le ZE (Zend Engine) comprend et arrive à exécuter. Pour Java, c'est la même chose. Il est compilé en byte code qui est interprété par la JVM (Java Virtual Machine). C'est ce qui permet entre autre l'interopérabilité des applications car il suffit de créer un interpréteur (ZE ou JVM) par plate-forme et le langage sera opérationnel sur cette plate-forme sans re-modifier le cœur/noyau du langage.

Petite note au passage, le byte code de Java n'est rien d'autres que de l'assembleur amélioré, i.e. avec quelques fonctionnalités supplémentaires, mais dans l'ensemble ça reste de l'assembleur, tout bêtement. Ça doit être pareil (je n'ai pas étudié encore cette partie), mais PHP ne réinvente par la roue dans ce genre de domaine, donc …

Pourquoi dit-on que PHP est alors interprété au lieu de compilé ? Je ne sais pas ce que les Wikipédestres nous diraient, mais je pense que c'est une notion de volée. PHP est compilé puis interprétée à la volée, c'est à dire que le résultat de la compilation n'est jamais stocké à long terme. Aussitôt compilé, aussitôt absorbé/interprété et supprimé. Alors que pour Java, on a le résultat de la compilation qui est stocké une fois pour toute. C'est juste ça. Pareil pour C/C++ etc. hein, je donne des exemples, je ne fais pas de favoritisme …

Maintenant, les performances d'un langage compilé ou interprété (avec les connaissances que l'on vient d'apprendre), je ne saurais tenir un comparatif pertinent … Peut-être que quelqu'un a étudié ça de manière plus approfondie que moi :-k
Trivialement, je dirais qu'il y a plus d'optimisations effectuées lors d'une compilation que d'un interprétation car de la vitesse de l'interprétation dépend l'attente du résultat. Si l'interpréteur met 10 minutes pour optimiser quelques lignes de codes, on aura perdu du temps. L'interpréteur doit donc transformer/compiler le code très rapidement. Le compilateur peut prendre son temps, on s'en fout pas mal, il nous faut un résultat optimisé (typiquement pour une plate-forme précise).

Disons qu'il y a des avantages et des inconvénients. On ne peut pas trancher à vif comme ça, ça mérite plus d'attentions et d'études.

par stopher » 23 janv. 2009, 14:36

Oui et non ,

Effectivement , on "compile" le code source java pour le transformé en "byte code" ( et non directement en langage machine ).

Ensuite , La JVM interprète ce "byte code" .

Je ne suis pas entré dans les détails car au finale , le code java est bien interprété par une JVM que j'ai ici comparé à apache ( d'ou la portabilité sans modification de code ) , ce n'est pas comme le C ou C++ qui eux , lorsqu'ils sont compilés , sont transformé en langage machine donc propre à une architecture , pour rendre un programme C++ compatible sur une autre archi , il faut le recompiler pour celle-ci ...

par rolusseum » 23 janv. 2009, 14:20

Comme : De la même façon que je Java , PHP est un langage interprété cela signifie que ton code source , n'est pas compilé et , n'a pas besoin de l'être pour qu'il puisse être utilisé
Heu! Je ne suis pas certain que Java fonctionne de la même manière. Java est un langage que l'on compile...

par albat » 23 janv. 2009, 12:39

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

par albat » 23 janv. 2009, 12:38

Juste un détail... :-*

Modération :
Merci de ne pas abuser des caractères en gras dans ton message.
C'est moins lisible et ça n'apporte rien de plus.