IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

putenv() affecte plusieurs scripts qui tournent en même temps [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 34
    Points : 26
    Points
    26
    Par défaut putenv() affecte plusieurs scripts qui tournent en même temps
    Bonjour,

    Lorsque je définis une variable d'environnement avec putenv(), ça affecte tous les scripts qui tournent en même temps.

    J'ai créé une page "test.php" pour illustrer le problème avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    putenv('TEST_VAR='.$_GET['test']);
     
    sleep(5);
     
    echo "TEST_VAR: ".getenv('TEST_VAR');
    Je lance "test.php?test=1"
    Pendant que ça attend, je lance "test.php?test=2"
    Fin du sleep dans le premier appel, ça répond : "TEST_VAR: 2" (au lieu de "TEST_VAR: 1")
    Fin du sleep dans le deuxième appel, ça répond : "TEST_VAR: " (au lieu de "TEST_VAR: 2")

    J'utilise WampServer v2.4 avec :
    - Apache 2.4.4
    - PHP 5.4.12

    Et je suis sous Windows 7 64bits.

    C'est vraiment problématique car j'utilise le package https://github.com/vlucas/phpdotenv pour charger ma config à partir d'un fichier .env et j'ai des conflits lorsque plusieurs requêtes ajax sont envoyées en même temps...

    Merci d'avance !

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Euh... c'est quand même un peu ça le principe d'une variable d'environnement : une variable disponible pour tout l'environnement, donc pour tous les scripts et autres joyeusetés qui tournent sur cet environnement.

    Donc la question ce serait plutot : as-tu vraiment besoin de variables d'environnement ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Finalement j'ai utilisé des constantes PHP plutôt que des variables d'environnement et ça résout le problème.

    La raison pour laquelle j'avais utilisé des variables d'environnement, comme je l'ai expliqué, c'est que j'ai voulu utilisé le package https://github.com/vlucas/phpdotenv qui permet de parser des variables de config définies dans un fichier ".env" qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    APP_ENV = local
    APP_DEBUG = 1
    DB_HOST = localhost
    DB_USERNAME = root
    DB_DATABASE = toto
    Ce que je ne comprends pas c'est que la version 5 de Laravel (c'est un framework PHP pour ceux qui ne connaissent pas) utilise phpdotenv pour charger des variables de config, exactement comme moi j'ai essayé de le faire. Vous pouvez aller voir sur le Github de Laravel : https://github.com/laravel/laravel/b...p/.env.example

    Du coup c'est foireux leur truc ! Les développeurs vont avoir les mêmes problèmes que moi j'ai eu. Il suffit juste de 2 requêtes AJAX envoyées en même temps et c'est le drame...

    Enfin bref, je terminerai en disant que je ne comprends pas l'intérêt de phpdotenv (et de putenv() de manière plus générale) par rapport aux constantes PHP.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Du coup c'est foireux leur truc ! Les développeurs vont avoir les mêmes problèmes que moi j'ai eu. Il suffit juste de 2 requêtes AJAX envoyées en même temps et c'est le drame...
    Bah non... c'est pas foireux leur truc car eux ils utilisent les variables d'environnement correctement et aucune de celles de l'exemple que tu pointes n'est supposée évoluer sur le serveur... Tu ne vas quand même pas faire basculer ton serveur de dev à prod au petit bonheur la chance ni changer tes identifiants de connexion à la base toutes les 5 minutes.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par Bioteck Voir le message
    je ne comprends pas l'intérêt de phpdotenv (et de putenv() de manière plus générale) par rapport aux constantes PHP.
    Une variable d'environnement, tu la renseignes avec une valeur qui est toujours la même pour tous les scripts tout le temps. Typiquement : les identifiants de connexion à la base.
    Une constante, tu la renseignes avec une valeur qui est toujours la même pour un script donné, pour la durée d'exécution de ce script.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Vous n'avez pas compris le problème en fait...

    Je viens d'installer Laravel 5 et de tester, et je confirme qu'il y a bien un problème !!

    Testez par vous même : installez Laravel 5 et créez deux routes dans "app/Http/routes.php" (c'est important que ce soit 2 routes différentes même si elles contiennent le même code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Route::get('test1', function()
    {
        sleep(5);
     
        return getenv('APP_ENV');
    });
     
    Route::get('test2', function()
    {
        sleep(5);
     
        return getenv('APP_ENV');
    });
    Appelez la première route. Pendant que "test1" tourne, appelez "test2" dans un autre onglet.

    "test1" va bien vous afficher "local" mais "test2" va vous renvoyer une erreur ! (ou une page vide, mais pas "local" comme attendu)

    Le problème est que quand "test1" se termine, les variables d'environnements sont réinitialisées comme c'est marqué dans la doc php de putenv() :

    Cette valeur n'existera que durant la vie du script courant, et l'environnement initial sera restauré lorsque le script sera terminé.
    http://php.net/manual/fr/function.putenv.php

    Et du coup, APP_ENV n'existe plus dans "test2".

    Je ne vois pas quoi dire de plus pour vous convaincre qu'il y a bien un problème...

    EDIT : Je viens de tester sur un serveur linux et pas de problème... bref, tant pis vu que j'utilise maintenant des constantes PHP mais si un jour je souhaite utiliser Laravel 5 il va falloir que je réécrive du code pour ne pas utiliser phpdotenv parce que ça va me poser réellement des soucis.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2009
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 34
    Points : 26
    Points
    26
    Par défaut
    Je viens de trouver la cause du problème... c'est le fait que PHP soit compilé en Thread Safe. Je m'en suis rendu compte en testant avec Zend Zerver, qui lui utilise PHP en Not Thread Safe.

    J'ai donc suivi cette procédure pour installer un PHP NTS avec WampServer : https://commaster.net/content/instal...che-wampserver, et ça marche nickel !

    En tout cas merci de vos réponses, hein... elles m'auront été précieuses...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2014, 19h35
  2. XML plusieurs balise qui portent le même nom.
    Par jeyGey dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/01/2013, 20h43
  3. [MySQL] Stocker plusieurs variables qui portent le même nom
    Par Cyclone200 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/12/2012, 00h16
  4. Réponses: 6
    Dernier message: 22/11/2006, 11h24
  5. 2 fonctions qui tournent en même temps
    Par GOUGOU1 dans le forum C
    Réponses: 7
    Dernier message: 07/12/2002, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo