Mimo że php ma PGPASSFILE w środowisku dziedziczy z Apache, co udowodnił getenv("PGPASSFILE") , wygląda na to, że to środowisko nie jest tym, które jest dostępne dla współdzielonej libpq biblioteka, która ostatecznie obsługuje .pgpass . Dlatego to ustawienie jest ignorowane.
Rozwiązaniem jest ponowne wprowadzenie do środowiska zmiennej, która już tam jest, w php przed połączeniem z bazą danych:
if (getenv("PGPASSFILE")!="")
putenv("PGPASSFILE=".getenv("PGPASSFILE"));
Wyraźne putenv wypchnie zmienną w taki sposób, aby była dostępna dla libpq wywołania funkcji getenv() . To dziwne, ponieważ zwykle proces ma tylko jedno środowisko, ale wydaje się, że działa.
Zapytałem o problem niezgodności środowiska między rozszerzeniami a rdzeniem php w osobnym pytaniu:Dlaczego potrzebne jest putenv() na już zdefiniowanej zmiennej środowiskowej?