A razão é esta:
Os valores de ambiente que você obtém de
getenv()[PHP]
(a função php) são diferentes do ambiente que você consulta com getenv()[C]
(a função C lib). O que getenv()[PHP]
faz, está verificando com o sapi registrado para uma correspondência (http ://lxr.php.net/xref/PHP_5_6/ext/standard/basic_functions.c#3999
). O apache2 sapi faz isso por meio de seu próprio contexto de ambiente (http://lxr.php.net/xref/PHP_5_6/sapi/apache2handler/sapi_apache2.c#253 ), não o ambiente padrão do sistema operacional do próprio processo apache.
SOMENTE quando não houver correspondência encontrada, ele verificará no ambiente do processo real. Então é por isso que
getenv()[PHP]
retorna um valor, mas getenv()[C]
não. Agora, o "hack" também é simples:
putenv()[PHP]
, armazena a chave/valor fornecido no ambiente do processo em execução, e é por isso que ele pode ser encontrado posteriormente por getenv()[c]
.