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 (https://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] .