使用Apache libphp5.so中的.pgpass

时间:2015-04-16 14:24:38

标签: php apache postgresql

我们正在尝试让我们的Apache PHP模块使用PostgreSQL .pgpass文件来查找数据库连接的密码。我们无法让它发挥作用。是否存在某种限制或错误阻止其工作?

这是我们拥有的和我们检查的内容。这一切都在FreeBSD 10.1上。

所有工作都按预期从命令行运行。也就是说,测试完全相同,除了PHP可执行文件是/ usr / local / bin / php而不是Apache PHP模块。

我们已经通过phpinfo()验证了Apache和命令行的构建尽可能相同,包括使用相同的共享库和相同的php.ini文件。

Apache版本2.2.29

  • /usr/local/libexec/apache22/libphp5.so
  • /usr/local/lib/php/20100525/pgsql.so

命令行PHP版本5.4.38

  • 的/ usr / local / bin中/ PHP的
  • /usr/local/lib/php/20100525/pgsql.so

在这两种情况下,我们将环境变量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 / )?

1 个答案:

答案 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?