Pendant le développement de PHP, les variables d'environnement sont une méthode de configuration très courante, qui sont souvent utilisées pour stocker les informations de connexion de la base de données, les clés d'API, les modes de fonctionnement (tels que le développement ou la production ), etc. Cependant, lorsque plusieurs composants ou bibliothèques tentent de définir la même variable d'environnement, des remplacements variables d'environnement peuvent se produire, ce qui entraîne un comportement non provisible.
Cet article expliquera comment utiliser la fonction PUTENV () de PHP pour définir raisonnablement des variables d'environnement, éviter les conflits et maintenir la stabilité et la maintenabilité des applications.
PHP PUTENV (String $ Affectation): La fonction BOOL est utilisée pour ajouter, modifier ou supprimer les variables d'environnement à la table variable d'environnement du processus actuel. Il agit directement sur l'environnement du système, est mondialement efficace (niveau de processus) et convient aux modes CLI et FPM.
Exemple:
<span><span><span class="hljs-title function_ invoke__">putenv</span></span><span>(</span><span><span class="hljs-string">"APP_ENV=production"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">getenv</span></span><span>(</span><span><span class="hljs-string">"APP_ENV"</span></span><span>); </span><span><span class="hljs-comment">// Sortir production</span></span><span>
</span></span>Plusieurs bibliothèques utilisent le même nom de variable : par exemple, plusieurs bibliothèques utilisent API_KEY et la valeur définie à la fin écrase la précédente.
Configuration de l'environnement de développement et de production incohérente : les variables du fichier .env ont été accidentellement écrasées pendant le déploiement.
Le fichier de configuration est répété avec les paramètres de code réels : la valeur de variable dans le fichier .env est modifiée par un appel puttenv () , entraînant une modification du comportement du programme.
Les préfixes des variables d'environnement définis dans votre projet peuvent effectivement éviter les conflits avec des bibliothèques tierces. Par exemple:
<span><span><span class="hljs-title function_ invoke__">putenv</span></span><span>(</span><span><span class="hljs-string">"MYAPP_API_KEY=abc123"</span></span><span>);
</span></span>De cette façon, même s'il y a d'autres bibliothèques, utilisez API_KEY et n'interfèrent pas les uns avec les autres.
Avant d'appeler Putenv () pour définir la variable, utilisez GETENV () pour vérifier si la variable existe déjà, afin d'éviter d'écraser accidentellement la valeur existante:
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">getenv</span></span><span>(</span><span><span class="hljs-string">'MYAPP_API_KEY'</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">putenv</span></span><span>(</span><span><span class="hljs-string">'MYAPP_API_KEY=abc123'</span></span><span>);
}
</span></span>Cette méthode convient à la hiérarchisation de l'utilisation de configurations externes (telles que les variables d'environnement du système, les variables d'injection de conteneurs) et ne force pas l'écrasement.
Les paramètres de variable d'environnement sont gérés uniformément via une fonction d'outil pour empêcher les appels PUTENV () de se diffuser dans le code. Par exemple:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">set_env_var</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$overwrite</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>): </span><span><span class="hljs-title">void</span></span><span> {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$overwrite</span></span><span> || </span><span><span class="hljs-title function_ invoke__">getenv</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">putenv</span></span><span>(</span><span><span class="hljs-string">"<span class="hljs-subst">{$key}</span></span></span><span>=</span><span><span class="hljs-subst">{$value}</span></span><span>");
}
}
</span></span>Lorsque vous utilisez:
<span><span><span class="hljs-title function_ invoke__">set_env_var</span></span><span>(</span><span><span class="hljs-string">'MYAPP_DB_HOST'</span></span><span>, </span><span><span class="hljs-string">'localhost'</span></span><span>);
</span></span>Cet emballage facilite également des extensions plus complexes à la gestion des variables environnementales à l'avenir.
Utilisez des outils populaires tels que Vlucas / PhpDotenV pour lire les fichiers .env et limiter le comportement d'écrasement. Par exemple:
<span><span><span class="hljs-variable">$dotenv</span></span><span> = </span><span><span class="hljs-title class_">Dotenv\Dotenv</span></span><span>::</span><span><span class="hljs-title function_ invoke__">createImmutable</span></span><span>(</span><span><span class="hljs-keyword">__DIR__</span></span><span>, </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span><span><span class="hljs-variable">$dotenv</span></span><span>-></span><span><span class="hljs-title function_ invoke__">safeLoad</span></span><span>();
</span></span>SafEload () saute les écrasants lorsqu'une variable existe déjà, adaptée à la protection de l'injection variable dans le déploiement des conteneurs et les processus CI / CD.
La superposition des variables d'environnement est un problème facile à négliger, en particulier dans les projets qui collaborent avec plusieurs équipes et utilisent un grand nombre de bibliothèques tierces. En utilisant rationnellement la fonction PUTENV () , en ajoutant des préfixes d'espace de noms, en encapsulant la logique de réglage et en évitant les remplacements inutiles, nous pouvons mieux contrôler le comportement de l'application et éviter les bogues causés par les erreurs de configuration.
N'oubliez pas que les variables d'environnement sont la "racine" de l'ensemble de la configuration de l'application et soyez très prudent lors du fonctionnement.