Dan*_*ité 18 php apache postgresql environment-variables
当php用作apache模块时,来自apache SetEnv指令的环境变量可用于php getenv(),但它似乎C不能通过stdlib扩展getenv().至少它发生在pgsql模块上.
如果使用php代码重新实例化该变量:
putenv("varname=".getenv("varname"));
Run Code Online (Sandbox Code Playgroud)
然后它可用于扩展程序的代码.
问题是:为什么需要重新实施?核心php环境与"标准"(stdlib)环境有何区别?
这发生在:PHP Version 5.3.10-1ubuntu3.17在Ubuntu 12.04中,作为apache模块.从命令行运行时,不需要上述解决方法.从另一个问题:在Apache libphp5中使用.pgpass.因此看起来这个解决方法对于FreeBSD下的php-5.4也是必需的,所以它不仅仅是Ubuntu或php-5.3.
它不依赖于variables_order有E它.我都试过EGPCS和GPCS,而$_ENV当不填充E不存在预期,但是这并没有改变的结果getenv(),作为记录,或明显STDLIB的结果getenv()从内部扩展.
问题的演示用的pgsql模块.它建立在libpq写入的共享库之上 C,它调用getenv()了一些可选的PG*环境变量.
在apache配置文件中,在a下<VirtualHost>,我将其设置为使连接尝试失败:
SetEnv PGHOST doesnotexist
Run Code Online (Sandbox Code Playgroud)
并且没有在pg_connect呼叫中指定主机,因此PGHOST必须在出现时进行.
首先尝试:
$v=getenv("PGHOST");
echo "PGHOST=$v\n";
$cnx=pg_connect("user=daniel");
if ($cnx) {
echo "Connection is successful.";
}
Run Code Online (Sandbox Code Playgroud)
结果:
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.";
}
Run Code Online (Sandbox Code Playgroud)
结果(无法按预期连接到指定的主机):
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
原因是这样的:
您从中获取的环境值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]没有.
现在,"hack"也是一个简单的:putenv()[PHP]将给定的键/值存储在正在运行的进程的环境中,这就是为什么以后可以找到它的原因getenv()[c].
| 归档时间: |
|
| 查看次数: |
4591 次 |
| 最近记录: |