Wie verwende ich putenv () um existierende Umgebungsvariablen zu aktualisieren?

8

Edit: Soweit ich das beurteilen kann, liegt meine Frage an einem Defekt in PHP. Ich habe diese Frage in den PHP-Bug-Tracker kopiert: Ссылка und plane, einen Fix zu implementieren .

Die Funktion putenv legt den Wert einer Umgebungsvariablen fest. Laut Handbuch kehrt putenv beim Erfolg zurück, falsch beim Scheitern.

Ich stelle jedoch fest, dass die Funktion putenv manchmal true zurückgibt, ohne die Umgebungsvariable für die aktuelle Sitzung zu aktualisieren.

Um dieses Problem zu reproduzieren, setzen Sie eine Umgebungsvariable auf einem Webserver mit PHP FPM, indem Sie die fastcgi_param-Direktive verwenden. Dies ist sehr nützlich, da es Umgebungsvariablen isoliert zu anderen Hosts auf demselben Server erlaubt.

Beispiel nginx.conf:

%Vor%

Beispiel test.php:

%Vor%

Ausgabe von test.php:

%Vor%

Wie Sie sehen können:

  1. Der vorhandene Wert wird von getenv erfolgreich gelesen,
  2. Die Funktion putenv gibt true zurück und zeigt Erfolg an,
  3. Der neue Wert ist nicht wirklich festgelegt, was unglaublich verwirrend ist.

Verstehe ich falsch, was der Zweck der Putenv-Funktion ist? Gibt es auf der Handbuchseite von setenv einige fehlende Dokumente? Wie verwende ich putenv (), um vorhandene Umgebungsvariable zu aktualisieren?

    
Greg 21.02.2017, 23:16
quelle

1 Antwort

2

Das ist interessant. Nach der Untersuchung fand ich, dass es einen undokumentierten Parameter für getenv() .

Aufruf von putenv("TESTVAR_ENV=new-value") gefolgt von getenv("TESTVAR_ENV", true) ergibt new-value wie erwartet. % Co_de% gibt jedoch beim Aufruf false zurück, ohne explizit den Wert vorher festzulegen.

Lesen Sie aus der Quelle scheint, dass, wenn local_only auf false gesetzt ist (der Standardwert), der Wert mit getenv("TESTVAR_ENV", true) abgerufen wird, während mit local_only der Wert sapi_getenv verwendet wird.

Darüber hinaus wird getenv als Fallback aufgerufen, wenn sapi_getenv keinen Wert zurückgibt. Das heißt, wenn Sie getenv in der nginx / Apache Konfiguration überhaupt nicht setzen, funktioniert TESTVAR_ENV / putenv wie erwartet.

Also zur Erinnerung:

  • getenv sucht in der internen Umgebungstabelle von SAPI (php-fpm) und Fallbacks in der Umgebung von OS, wenn die Variable nicht gesetzt ist.
  • getenv(name) durchsucht nur die Umgebung des Betriebssystems, die (abhängig vom SAPI) nicht unbedingt Variablen enthält, die in der Konfiguration des Webservers registriert sind.
  • getenv(name, true) aktualisiert immer nur die Umgebung des Betriebssystems.

Ich habe Folgendes zum Testen verwendet:

%Vor%     
Joe 22.02.2017, 11:15
quelle