2015-04-16 49 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?

相關問題