De reden is deze:
De omgevingswaarden die u krijgt van getenv()[PHP]
(de php-functie) zijn anders dan de omgeving die u opvraagt met getenv()[C]
(de C lib-functie). Wat getenv()[PHP]
doet, controleert bij de geregistreerde sapi of er een overeenkomst is (http ://lxr.php.net/xref/PHP_5_6/ext/standard/basic_functions.c#3999
).
De apache2 sapi doet dit via zijn eigen omgevingscontext (http://lxr.php.net/xref/PHP_5_6/sapi/apache2handler/sapi_apache2.c#253 ), niet de standaard OS-omgeving van het apache-proces zelf.
ALLEEN als er geen match wordt gevonden, wordt er gecontroleerd in de omgeving van het daadwerkelijke proces. Dus dit is waarom getenv()[PHP]
geeft een waarde terug, maar getenv()[C]
niet.
Nu is de "hack" ook eenvoudig:putenv()[PHP]
, slaat de gegeven sleutel/waarde op in de omgeving van het lopende proces, daarom kan het later worden gevonden door getenv()[c]
.