我们正在尝试让我们的Apache PHP模块使用PostgreSQL .pgpass文件来查找数据库连接的密码。我们无法让它发挥作用。是否存在某种限制或错误阻止其工作?
这是我们拥有的和我们检查的内容。这一切都在FreeBSD 10.1上。
所有工作都按预期从命令行运行。也就是说,测试完全相同,除了PHP可执行文件是/ usr / local / bin / php而不是Apache PHP模块。
我们已经通过phpinfo()验证了Apache和命令行的构建尽可能相同,包括使用相同的共享库和相同的php.ini文件。
Apache版本2.2.29
命令行PHP版本5.4.38
在这两种情况下,我们将环境变量PGPASSFILE设置为相同的值,并从PHP中验证它是否正确。
在这两种情况下,我们都使用相同的Unix用户名('www'),因此我们确定它不是文件路径或权限问题。
我们的系统上只有一个PostgreSQL库,位于/usr/local/lib/libpq.so。这是应该发生.pgpass文件的二进制文件。
还有其他人遇到过这个问题吗?我们有什么东西可以俯瞰吗?
Apache的libphp5.so是否会以某种方式绕过PHP库pgsql.so的使用并直接调用libpq.so,尽管它被配置为使用相同的PHP共享库目录(即/ usr / local / lib / php / 20100525 / )?
答案 0 :(得分:1)
即使php在环境中有PGPASSFILE
,它仍然从apache继承,正如getenv("PGPASSFILE")
所证明的那样,这个环境似乎不是共享{{1}可用的环境。最终处理libpq
的库。这就是忽略此设置的原因。
解决方法是在连接到数据库之前在php中将已经存在的变量重新输入到环境中:
.pgpass
明确if (getenv("PGPASSFILE")!="")
putenv("PGPASSFILE=".getenv("PGPASSFILE"));
将推送变量的方式使putenv
的{{1}}调用可用。这很奇怪,因为通常一个进程只有一个环境,但似乎有效。
我在一个单独的问题中询问了扩展和php核心之间的不一致环境问题: Why is putenv() needed on an already defined environment variable?