繁体   English   中英

从Apache libphp5.so使用.pgpass

[英]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

  • /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共享库目录(即/ 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将以某种方式推送变量,使其可用于libpqgetenv()调用。 这很奇怪,因为通常一个进程只有一个环境,但是它似乎可以工作。

我曾在一个单独的问题中问过扩展和php核心之间的不一致环境问题: 为什么在已经定义的环境变量上需要putenv()?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM