2015-04-16 25 views
1

我们试图让我们的Apache PHP模块使用PostgreSQL .pgpass文件查找数据库连接的密码。我们一直无法让它工作。是否有某种限制或错误阻止了它的工作?使用Apache的.pgpass libphp5.so

这是我们有什么,我们已经检查。这一切都在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 38年5月4日

  • 在/ usr/local/bin目录/ PHP
  • 在/ usr /本地/李b/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

对于原因,我不明白,我发现我需要发出'运行putenv(“PGSOMETHING =“.getenv(”PGSOMETHING“));'让'pg_connect'尊敬我的apache env vars,否则会被忽略。也许试试? –

+0

会试一试。谢谢! – CXJ

+0

奇怪,因为这行代码应该是一个没有操作 - 它的工作!谢谢。将您的评论置入答案中,并将其标记为已接受,以便您可以获得声望点。 – CXJ

回答

1

即使PHP中有来自Apache的继承环境PGPASSFILE,由getenv("PGPASSFILE")作为证明,看来这个环境是不是一个可用的共享libpq库,最终处理.pgpass。这就是为什么这个设置被忽略。

一种解决方法是在连接到数据库之前,reput到环境中已经存在的变量,在PHP中:

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

的明确putenv将推动可变的方式,使其可用于libpq“ s的电话getenv()。这很奇怪,因为通常一个进程只有一个环境,但它似乎工作。

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