在Windows系统中,PHP无法加载php_pgsql.dll模块

36

PHP 5.2.8 拒绝加载 php_pgsql.dll,并显示以下错误信息:

警告:PHP启动时出现问题:无法加载动态链接库'D:\PHP\ext\php_pgsql.dll' - 指定的模块无法找到。

位于未知行0

.dll 文件位于 PHP/ext/ 目录下。

之前在 Windows 上遇到过 PHP 的这个问题的人有吗?


2
这是我在PHP和DLL方面一直遇到的一个反复出现的问题。我只是将有问题的DLL文件复制到C:\WINDOWS并停止了烦恼。PHP的路径处理非常混乱,以至于我甚至不关心是否按照“正确的方式”来处理它。 - kquinn
请点击此处查看如何使用pgsql编译PHP:https://wiki.php.net/internals/windows/stepbystepbuild - Mantisse
17个回答

88

查看PHP PostgreSQL安装页面上的信息:http://us.php.net/manual/en/pgsql.installation.php

在配置了Apache的Windows服务器上,通过将以下行添加到httpd.conf以加载libpq.dll可以节省大量时间:

LoadFile "C:/Program Files/PostgreSQL/8.4/bin/libpq.dll"

请注意,您需要根据安装路径和已安装的PostgreSQL版本相应更改文件夹。此外,请注意,在生产环境中在同一台服务器上运行Apache和PostgreSQL并不推荐。

这立即解决了我的设置问题。


同样在同一页上,Simon 的第一条评论指出 5.2.5 版本的 "php_pgsql.dll" 可以使用。而且确实可以 :). 惊喜惊喜!... - StefanNch
如果PostgreSQL是64位的,则无法正常工作。在这种情况下,从PostgreSQL 32位安装中复制libpq.dll并放入apache/bin文件夹中。 - coding_idiot
谢谢。对我来说可行! :-) - west44
谢谢,你刚刚解决了我的问题。但是这个答案应该被改进,因为新的PHP Windows堆栈在php文件夹中包含libpq.dll。所以,你也可以从PHP Windows分发文件夹中选择,而不是从postgres文件夹中选择。 - Henry Eko
nginx配置文件怎么样? - Mantisse
显示剩余3条评论

47

我也遇到了PHP 5.4.1的这个问题。

将有问题的DLL文件复制到各处并不能解决问题。而且我在服务器上没有安装PostgreSQL,但我计划使用PHP与不同版本的Postgres一起使用,所以唯一行之有效的解决方法是在httpd.conf文件中添加以下内容:

LoadFile "C:/Program Files/PostgreSQL/8.4/bin/libpq.dll"

就像这样引用与PHP捆绑在一起的libpq.dll:

LoadFile "C:/php/libpq.dll"

之后对我来说运行良好。


9
这拯救了我在Win7 64位系统上的一天,因为来自Program Files/PostreSQL的libpq.dll无法加载。 - dwich
我尝试了Mac的技巧后,都起作用了,谢谢Dayron。 - WhySoSerious
运行得很好,太棒了! - Junaid Atari
同样适用于5.4.31。非常感谢! - Frank
仍然适用于PHP 7.1.5。 - Reactgular

7

对于那些希望让他们的PHP安装只能访问PostGres服务器而不实际安装PostGres的人,您需要:

  • 在PHP.INI中启用php_pgsql.dll(如果使用PDO则还需启用php_pdo_pgsql.dll),
  • 确保 libpq.dll、libiconv-2.dll 和 libintl-8.dll 在路径中。这些是 php_pgsql.dll 的依赖项。

这3个DLL可以在PostGres安装包中找到。我将它们复制到apache\bin中,这样我就能保持一切都是自包含的。这样做,apache就可以很好地启动PHP引擎,并支持PostGres。


4

您需要将libpq.dll从wamp\bin\php\php5.3.5复制到wamp\bin\apache\Apache2.2.17\bin。然后重新启动Wamp服务器。现在我们已经完成了php配置。接下来,我们将安装phpPgAdmin并使用它。


4
问题出在php_pgsql.dll使用的相关库上,例如libpq.dll、OpenSSL等。你需要找到它们(从Postgres的zip发行版中,从已安装的psqlODBC驱动程序中等),并将它们放在PATH路径下的文件夹中。至于所有DLL列表,请使用MS Dependency Walker(depends.exe)。

另一个重要因素是,Apache(如果你使用的是Apache)有自己一套OpenSSL DLLs,你需要将其替换或改名,以免与Postgres发行版中的DLLs发生冲突。


1
听起来很复杂 - 但当我从命令行运行PHP -v时,它会抛出一个错误,说libpq.dll无法加载。说实话,我可能会将所有开发工作都转移到Ubuntu上。 - Ross
1
例如,在XAMPP上,只需将PHP目录(即 C:\xampp\php)添加到系统的PATH环境变量中即可。 - Ondřej Bouda

2

我只想分享一下我的经验,不需要涉及 libpq.dll。我在 php.ini 文件中取消了 extension=php_pdo_pgsql.dllextension=php_pgsql.dll 的注释。首先,apache 拒绝启动。

然后,我将 "C:\Program Files (x86)\PostgreSQL\9.4\bin\"(根据你的安装情况而定)添加到 Windows 环境 PATH 中,成功启动了 apache 并运行正常。


2

一个想法--确保Postgres二进制文件在系统路径中,而不是您特定的用户路径。恰好在我的机器上,这就是问题所在。 :-)

编辑:

想一想,这就解释了为什么Dependency Walker会报告一切正常,但问题仍然存在--您在自己的帐户下运行DW,而Apache作为SYSTEM运行,因此不会有您个人的PATH设置。


1
这是对 @Dayron Armas Peña 的回答的更新。php捆绑的pgsql 'dll'可以在以下位置找到:
LoadFile "C:/wamp/bin/php/php5.4.12/libpq.dll"

除了取消注释php.ini文件中所需的行之外,将上述行添加到httpd.conf文件中也解决了我的问题。


1
作为Ondřej Bouda提到的,设置Windows环境变量就足够了。不需要dll文件副本,也不需要在http-conf中添加条目。只需将php目录(C:\ xampp \ php)添加到PATH中即可。如果使用XAMPP-Control-Panel,请不要忘记重新启动它,否则它将不知道更改。(当然,还要重新启动Apache。)
例如,在XAMPP上,只需将PHP目录(即C:\ xampp \ php)放入系统PATH变量中即可。- Ondřej Bouda

1

针对WAMP服务器设置,您需要将libpg.dll文件复制到“C:\wamp\bin\apache\Apache2.2.21\bin\"或类似目录中。仅将其复制到..\php\ext\并调整PATH环境变量是不够的(如果有效的话)。

原始答案来源:http://www.wampserver.com/phorum/read.php?2,40270,57932

针对XAMPP设置,我发现我只需要将libpg.dll文件复制到..\php\ext\目录中即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接