Когда php
используется как модуль apache
, переменная среды, исходящая из директивы apache SetEnv
, доступна для php getenv()
, но она не представляется доступной для C
расширений через stdlib getenv()
. По крайней мере, это происходит с модулем pgsql
.
Если переменная повторно установлена с помощью php-кода:
putenv("varname=".getenv("varname"));
тогда он становится доступным для кода расширения.
Вопрос: зачем нужна переустановка? Как основная среда php отличается от "стандартной" (stdlib
) среды?
Это происходит с помощью PHP Version 5.3.10-1ubuntu3.17
в Ubuntu 12.04, в качестве модуля apache. При запуске из командной строки это обходное решение не требуется.
Из этого другого вопроса: Использование .pgpass из Apache libphp5.so кажется, что это обходное решение также необходимо для php-5.4 под FreeBSD, поэтому это не просто Ubuntu или php-5.3.
Это не зависит от variables_order
, имеющего E
. Я пробовал как EGPCS
, так и GPCS
, а $_ENV
не заполняется, если E
не существует, как и ожидалось, но это не меняет результат getenv()
, так как документально или, по-видимому, результат stdlib getenv()
из внутренних расширений.
Демонстрация проблемы с помощью модуля pgsql
. Он построен поверх общей библиотеки libpq
, написанной в C
, которая вызывает getenv()
в нескольких необязательных переменных среды PG*
.
В файле конфигурации apache, под <VirtualHost>
, я устанавливаю это, чтобы попытки подключения не выполнялись:
SetEnv PGHOST doesnotexist
и не указывая хост в вызове pg_connect
, поэтому PGHOST
следует принимать, когда он присутствует.
Первая попытка:
$v=getenv("PGHOST");
echo "PGHOST=$v\n";
$cnx=pg_connect("user=daniel");
if ($cnx) {
echo "Connection is successful.";
}
Результат:
PGHOST=doesnotexist Connection is successful.
Итак, PGHOST
игнорируется, несмотря на то, что он находится в среде.
Вторая попытка, теперь снова помещая PGHOST
в среду, даже если она уже существует:
$v=getenv("PGHOST");
echo "PGHOST=$v\n";
putenv("PGHOST=".getenv("PGHOST"));
$cnx=pg_connect("user=daniel");
if ($cnx) {
echo "Connection is successful.";
}
Результат (невозможность подключения к указанному хосту, как ожидалось):
PGHOST=doesnotexist Warning: pg_connect(): Unable to connect to PostgreSQL server: could not translate host name "doesnotexist" to address: Name or service not known in /var/www/test/pgtest2.php on line 8