[英]Using .pgpass from Apache libphp5.so
我们正在尝试使我们的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共享库目录(即/ usr / local / lib / php / 20100525 /),但它是否以某种方式绕过了PHP库pgsql.so的使用并直接调用libpq.so?
正如getenv("PGPASSFILE")
所证明的那样,即使php在它从apache继承的环境中具有PGPASSFILE
,似乎该环境也不是最终处理.pgpass
的共享libpq
库可用的环境。 这就是为什么此设置被忽略的原因。
一种解决方法是在连接到数据库之前,将环境中存在于php中的变量放入环境中:
if (getenv("PGPASSFILE")!="")
putenv("PGPASSFILE=".getenv("PGPASSFILE"));
显式putenv
将以某种方式推送变量,使其可用于libpq
的getenv()
调用。 这很奇怪,因为通常一个进程只有一个环境,但是它似乎可以工作。
我曾在一个单独的问题中问过扩展和php核心之间的不一致环境问题: 为什么在已经定义的环境变量上需要putenv()?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.