Причината е следната:
Стойностите на средата, които получавате от getenv()[PHP] (php функцията) са различни от средата, която заявявате с getenv()[C] (функцията C lib). Какво getenv()[PHP] прави, проверява с регистрирания sapi за съвпадение (http ://lxr.php.net/xref/PHP_5_6/ext/standard/basic_functions.c#3999
).
Apache2 sapi прави това чрез своя собствен контекст на среда (https://lxr.php.net/xref/PHP_5_6/sapi/apache2handler/sapi_apache2.c#253 ), а не стандартната операционна среда от самия процес на apache.
САМО когато не бъде намерено съвпадение, ще се провери средата на действителния процес. Ето защо getenv()[PHP] връща стойност, но getenv()[C] не.
Сега „хакът“ също е прост:putenv()[PHP] , съхранява дадения ключ/стойност в средата на изпълнявания процес, поради което може да бъде намерен по-късно от getenv()[c] .