Причината е следната:
Стойностите на средата, които получавате от 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 прави това чрез своя собствен контекст на среда (http://lxr.php.net/xref/PHP_5_6/sapi/apache2handler/sapi_apache2.c#253 ), а не стандартната операционна среда от самия процес на apache.
САМО когато не бъде намерено съвпадение, ще се провери средата на действителния процес. Ето защо getenv()[PHP]
връща стойност, но getenv()[C]
не.
Сега „хакът“ също е прост:putenv()[PHP]
, съхранява дадения ключ/стойност в средата на изпълнявания процес, поради което може да бъде намерен по-късно от getenv()[c]
.