【问题标题】:Using .pgpass from Apache libphp5.so使用来自 Apache libphp5.so 的 .pgpass
【发布时间】:2015-06-23 00:49:05
【问题描述】:

我们正在尝试让我们的 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/ )?

【问题讨论】:

  • 出于我不明白的原因,我注意到我需要发出 putenv("PGSOMETHING=" .getenv("PGSOMETHING")); 以使 pg_connect 尊重我的 apache 环境变量,否则它们将被忽略。可以试试吗?
  • 会试一试。谢谢!
  • 很奇怪,因为那行代码应该只是一个空操作——它确实有效!谢谢。将您的评论变成答案,我会将其标记为已接受,以便您获得声誉积分。
  • 我同意这很奇怪。我提出了一个问题:stackoverflow.com/questions/29700814 也许有一些合理的解释。

标签: php apache postgresql


【解决方案1】:

尽管 php 在它从 apache 继承的环境中具有 PGPASSFILE,正如 getenv("PGPASSFILE") 所证明的那样,但似乎这个环境并不是最终处理 .pgpass 的共享 libpq 库可用的环境。这就是此设置被忽略的原因。

一种解决方法是在连接到数据库之前在 php 中将已经存在的变量重新放入环境中:

if (getenv("PGPASSFILE")!="")
  putenv("PGPASSFILE=".getenv("PGPASSFILE"));

显式putenv 将推送变量,使其可用于libpqgetenv() 调用。这很奇怪,因为通常一个进程只有一个环境,但它似乎可以工作。

我在一个单独的问题中询问了扩展和 php 核心之间的不和谐环境问题: Why is putenv() needed on an already defined environment variable?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2016-07-24
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多