gpt4 book ai didi

php - 使用来自 Apache libphp5.so 的 .pgpass

转载 作者:行者123 更新时间:2023-11-29 13:28:12 24 4
gpt4 key购买 nike

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

最佳答案

即使 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?

关于php - 使用来自 Apache libphp5.so 的 .pgpass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29677674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com