httpd libphp5.so ldap 错误
Httpd libphp5.so ldap error
Solved by Julz
Thank you!
$ brew uninstall php56
$ brew install php56 --without-ldap
所以,我需要一些帮助,我环顾四周,但找不到任何解决问题的方法。
我已经通过 Homebrew 安装了 Apache 和 PHP,但由于某些原因它们似乎不能一起工作。
Apache 通过 Homebrew/apache tap 安装 httpd24 --enable-rewrite --enable-ssl --with-privileged-ports --with-http2
PHP 使用 php56 --with-homebrew-apxs --with-apache --with-homebrew-curl --with-homebrew-openssl[ 安装=29=] 通过 Homebrew/homebrew-php 点击
并且它们都安装正确,我在httpd.conf中加载了libphp5.so;就像你一样,当我 运行 sudo httpd -k start / restart 我得到这个:
httpd:
Syntax error on line 173 of /usr/local/etc/apache2/2.4/httpd.conf:
Cannot load /usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so into server:
dlopen(/usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so, 10):
Symbol not found: _ldap_control_find
Referenced from: /usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so
Expected in: /System/Library/Frameworks/LDAP.framework/Versions/A/LDAP
in /usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so
我一辈子都弄不明白哪里出了问题,有什么帮助吗? Apache 在没有 php 库的情况下工作正常。
我今天通过自制程序升级了 php56,并且拥有相同的 pb。好像跟ldap支持有关。
在提供修复之前我建议卸载 php56 然后在没有 ldap 的情况下重新安装
$ brew uninstall php56
$ brew install php56 --without-ldap
简单快捷。
对于面临此问题的任何其他人,因为他们正在处理的项目需要它而无法禁用 LDAP 支持,另一种方法是让 Homebrew 重新安装 PHP通过从它的源代码构建它,我在下面描述了它以及多年来我发现的一些技巧,这些技巧对于一般调试与 PHP 相关的问题以及将 PHP 加载到 Web 服务器环境(在这个案例阿帕奇)。我希望下面的信息对其他人有用,并节省其他人解决这个问题的时间。
对于许多 Homebrew 软件包,当您简单地执行 brew install <package>
命令时,Homebrew 将安装您正在安装的软件的预编译版本(Homebrew 社区的成员热心贡献)。在大多数情况下,这很好,因为它可以节省很多时间(因为代码已经编译,一些复杂的代码库可能需要数小时才能编译!),并且在大多数情况下,预编译版本就是您想要的。
然而,当预编译版本似乎包含错误或可能与其他已安装的软件冲突时,从源安装软件包(或者让 Homebrew 代表您从源重新安装软件包)可能能够解决问题你正在经历。然而,应该注意的是,此处的建议解决方案可能并不适用于所有人或所有类似问题——结果取决于许多变量,例如错误实际存在的位置——例如,如果错误存在于你正在使用的软件的源代码中安装,那么这个解决方案不太可能有帮助,但如果错误是由软件的配置方式或与其他代码预先打包的方式引起的,它可能会有用,幸运的是在这种情况下。
解决问题:通过 Homebrew 从源代码重新安装 PHP
我能够通过 运行 在 OS X 10.10.5 Yosemite 上从 Homebrew 成功安装 PHP 5.6,通过以下命令:
brew reinstall php56 --build-from-source
注意特殊的 Homebrew --build-from-source
标志——这告诉 Homebrew 不要安装您正在安装的包的预构建版本,而是从其源代码存储库重新构建包。
您实际上可能会像我一样发现,我首先必须删除 PHP 5.6(通过 brew uninstall php56
),然后 运行 执行上述命令(您实际上可以更改reinstall
在执行 uninstall
后仅 install
的子命令在语义上是正确的,但是 reinstall
命令无论软件包是否已经安装都有效)。
重新安装 PHP 扩展模块 PHP
我还发现有必要重新安装我已经安装的附加 PHP 模块包(例如 OPCache),方法是 运行在 PHP 之后 brew reinstall php56-<module>
5.6 已通过从源代码构建重新安装。
您可以通过 运行ning brew list | grep php
查看您通过 Homebrew 安装了哪些其他 PHP 模块包。简单地重新安装它们应该是安全的,您可以通过 运行 执行以下操作轻松完成:
brew list | grep php56 | xargs -I{} brew reinstall {}
如果您想更有针对性地重新安装,您应该能够通过查看启动 Web 服务器的输出来查看哪些 PHP 模块加载失败(如果有任何冲突) ,查看您的 Web 服务器日志,或查看在命令行上简单地调用 PHP 二进制文件的输出(假设您的路径设置正确以指向您刚刚使用 Homebrew 安装的 PHP 版本,它通常会是)。
可以在下面找到有关查找调试信息的这些地方的一些注释:
Apache HTTPD 启动调试输出
要查看在 OS X 上启动 Apache 的详细输出,您可以 运行 以下命令:
sudo httpd -k restart -e debug
这是 运行ning sudo apachectl restart
的替代方案,后者是 httpd
二进制文件的包装脚本 - -k restart
选项告诉 httpd
哪个函数执行(在这种情况下重新启动 - 你可以通过 运行ning man httpd
查看所有支持的选项),并且 -e
标志允许你设置详细级别 - 默认是有效的沉默的。将 -e
设置为 debug
级别可提供最高级别的输出,因此如果在加载配置的 Apache 模块之一时出现问题,您将在上述命令的 运行 的输出中看到它.因此,如果您发现 Apache 实例没有按预期工作,这通常是一个很好的起点。
Apache HTTPD 错误登录 OS X
要查看 OS X 上的 Apache 日志,请打开 Console.app(可在 /Applications/Utilities/
文件夹中找到)并展开 /var/log/apache2/
文件夹日志列表侧边栏,然后是select error_log
文件。在这里你应该看到 Apache 加载时的额外输出(当你从控制台 运行 sudo httpd -k restart -e debug
命令时打开 Console.app 是很好的)。
如果 PHP 本身在加载其任何模块时遇到问题,您应该会在 Console.app 中的 error_log
中看到与此相关的这些错误。
您还可以打开另一个 Terminal/console window 并 运行 sudo tail -f /var/log/apache2/error_log
作为使用 Console.app 的替代方法。使用 tail -f
也会以有效的即时方式更新,而 Console.app 中显示的输出有时会滞后于实际事件,如果您没有看到预期的输出,有时可能需要手动刷新.
PHP 启动错误
最后,要查看 PHP 是否遇到任何错误而不增加网络服务器自身加载过程的复杂性,您可以在命令行上 运行 PHP并查看 PHP 是否在那里发出任何错误。
值得注意的是,在大多数系统上,通过命令行将 PHP 配置为 运行 的方式与在 Apache 中将其配置为 运行 的方式大体相同,特别是关于加载哪些扩展模块,但如果您的系统配置不同,您可能需要结合使用检查 Web 服务器的错误日志输出以及 运行ning [=138= 的输出] 直接在命令行确保所有加载errors/conflicts已经完全解决
运行 PHP 带有 -v
标志以获取 PHP 打印其当前构建信息通常是查看正在发生的事情的快速方法,并且不在 REPL 模式下保留 PHP 二进制文件(等待用户输入):
php -v
如果您在 php.ini
中配置的任何 PHP 模块(扩展)或通过 php.ini
加载的另一个 .ini
文件出现问题加载,您应该会在 PHP 打印的版本信息上方看到错误输出到控制台。例如,您可能会看到这样的内容:
Warning: PHP Startup: sodium: Unable to initialize module
Module compiled with build ID=API20131226,NTS,debug
PHP compiled with build ID=API20131226,NTS
These options need to match
in Unknown on line 0
PHP 5.6.20 (cli) (built: Apr 14 2016 14:23:48)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with XCache v3.2.0, Copyright (c) 2005-2014, by mOo
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans
with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo
由于构建设置之间的冲突,您可以在上方看到与加载 libsodium
(sodium
) PHP 扩展模块相关的错误。在此示例中,为了说明潜在的冲突,PHP 之前已使用 --with-debug
标志安装,而重新安装的版本缺少此设置。另一种选择是从源代码重新安装和重建 PHP,同时启用调试选项 (brew reinstall php56 --build-from-source --with-debug
)。
虽然模块冲突的原因各不相同,但您通常会发现使用 Homebrew 重新安装任何受影响的 PHP 扩展模块包(一旦 PHP 本身已重新安装)将解决冲突。在这种情况下,我 运行 以下命令重新安装 PHP libsodium
软件包:
brew reinstall php56-sodium
模块安装完成后,当我重新运行 php -v
时,与加载此模块相关的错误不再存在,我能够确认libsodium
扩展模块已通过检查 php -m
的输出成功加载到 PHP(告诉 PHP 列出所有加载的模块),然后我使用 grep "sodium"
(完整命令为 php -m | grep "sodium"
)在这种情况下仅显示 php -m
中包含字符串 sodium
.
的任何行
您可以替换上面命令中遇到问题的特定 PHP 扩展模块,例如将 sodium
换成 opcache
,等等
PHP 未通过 Homebrew 安装模块扩展
请注意,如果您在使用 Homebrew 之外安装了额外的 PHP 扩展模块,例如来自 PHP PECL 存储库的扩展,则可能还需要重新安装其中的一个或多个通过 Homebrew 重新安装 PHP 后的附加模块。您应该查阅这些附加模块的安装说明,以确定如何最好地重新安装它们。
Solved by Julz
Thank you!
$ brew uninstall php56 $ brew install php56 --without-ldap
所以,我需要一些帮助,我环顾四周,但找不到任何解决问题的方法。
我已经通过 Homebrew 安装了 Apache 和 PHP,但由于某些原因它们似乎不能一起工作。
Apache 通过 Homebrew/apache tap 安装 httpd24 --enable-rewrite --enable-ssl --with-privileged-ports --with-http2
PHP 使用 php56 --with-homebrew-apxs --with-apache --with-homebrew-curl --with-homebrew-openssl[ 安装=29=] 通过 Homebrew/homebrew-php 点击
并且它们都安装正确,我在httpd.conf中加载了libphp5.so;就像你一样,当我 运行 sudo httpd -k start / restart 我得到这个:
httpd:
Syntax error on line 173 of /usr/local/etc/apache2/2.4/httpd.conf:
Cannot load /usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so into server:
dlopen(/usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so, 10):
Symbol not found: _ldap_control_find
Referenced from: /usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so
Expected in: /System/Library/Frameworks/LDAP.framework/Versions/A/LDAP
in /usr/local/Cellar/php56/5.6.20/libexec/apache2/libphp5.so
我一辈子都弄不明白哪里出了问题,有什么帮助吗? Apache 在没有 php 库的情况下工作正常。
我今天通过自制程序升级了 php56,并且拥有相同的 pb。好像跟ldap支持有关。
在提供修复之前我建议卸载 php56 然后在没有 ldap 的情况下重新安装
$ brew uninstall php56
$ brew install php56 --without-ldap
简单快捷。
对于面临此问题的任何其他人,因为他们正在处理的项目需要它而无法禁用 LDAP 支持,另一种方法是让 Homebrew 重新安装 PHP通过从它的源代码构建它,我在下面描述了它以及多年来我发现的一些技巧,这些技巧对于一般调试与 PHP 相关的问题以及将 PHP 加载到 Web 服务器环境(在这个案例阿帕奇)。我希望下面的信息对其他人有用,并节省其他人解决这个问题的时间。
对于许多 Homebrew 软件包,当您简单地执行 brew install <package>
命令时,Homebrew 将安装您正在安装的软件的预编译版本(Homebrew 社区的成员热心贡献)。在大多数情况下,这很好,因为它可以节省很多时间(因为代码已经编译,一些复杂的代码库可能需要数小时才能编译!),并且在大多数情况下,预编译版本就是您想要的。
然而,当预编译版本似乎包含错误或可能与其他已安装的软件冲突时,从源安装软件包(或者让 Homebrew 代表您从源重新安装软件包)可能能够解决问题你正在经历。然而,应该注意的是,此处的建议解决方案可能并不适用于所有人或所有类似问题——结果取决于许多变量,例如错误实际存在的位置——例如,如果错误存在于你正在使用的软件的源代码中安装,那么这个解决方案不太可能有帮助,但如果错误是由软件的配置方式或与其他代码预先打包的方式引起的,它可能会有用,幸运的是在这种情况下。
解决问题:通过 Homebrew 从源代码重新安装 PHP
我能够通过 运行 在 OS X 10.10.5 Yosemite 上从 Homebrew 成功安装 PHP 5.6,通过以下命令:
brew reinstall php56 --build-from-source
注意特殊的 Homebrew --build-from-source
标志——这告诉 Homebrew 不要安装您正在安装的包的预构建版本,而是从其源代码存储库重新构建包。
您实际上可能会像我一样发现,我首先必须删除 PHP 5.6(通过 brew uninstall php56
),然后 运行 执行上述命令(您实际上可以更改reinstall
在执行 uninstall
后仅 install
的子命令在语义上是正确的,但是 reinstall
命令无论软件包是否已经安装都有效)。
重新安装 PHP 扩展模块 PHP
我还发现有必要重新安装我已经安装的附加 PHP 模块包(例如 OPCache),方法是 运行在 PHP 之后 brew reinstall php56-<module>
5.6 已通过从源代码构建重新安装。
您可以通过 运行ning brew list | grep php
查看您通过 Homebrew 安装了哪些其他 PHP 模块包。简单地重新安装它们应该是安全的,您可以通过 运行 执行以下操作轻松完成:
brew list | grep php56 | xargs -I{} brew reinstall {}
如果您想更有针对性地重新安装,您应该能够通过查看启动 Web 服务器的输出来查看哪些 PHP 模块加载失败(如果有任何冲突) ,查看您的 Web 服务器日志,或查看在命令行上简单地调用 PHP 二进制文件的输出(假设您的路径设置正确以指向您刚刚使用 Homebrew 安装的 PHP 版本,它通常会是)。
可以在下面找到有关查找调试信息的这些地方的一些注释:
Apache HTTPD 启动调试输出
要查看在 OS X 上启动 Apache 的详细输出,您可以 运行 以下命令:
sudo httpd -k restart -e debug
这是 运行ning sudo apachectl restart
的替代方案,后者是 httpd
二进制文件的包装脚本 - -k restart
选项告诉 httpd
哪个函数执行(在这种情况下重新启动 - 你可以通过 运行ning man httpd
查看所有支持的选项),并且 -e
标志允许你设置详细级别 - 默认是有效的沉默的。将 -e
设置为 debug
级别可提供最高级别的输出,因此如果在加载配置的 Apache 模块之一时出现问题,您将在上述命令的 运行 的输出中看到它.因此,如果您发现 Apache 实例没有按预期工作,这通常是一个很好的起点。
Apache HTTPD 错误登录 OS X
要查看 OS X 上的 Apache 日志,请打开 Console.app(可在 /Applications/Utilities/
文件夹中找到)并展开 /var/log/apache2/
文件夹日志列表侧边栏,然后是select error_log
文件。在这里你应该看到 Apache 加载时的额外输出(当你从控制台 运行 sudo httpd -k restart -e debug
命令时打开 Console.app 是很好的)。
如果 PHP 本身在加载其任何模块时遇到问题,您应该会在 Console.app 中的 error_log
中看到与此相关的这些错误。
您还可以打开另一个 Terminal/console window 并 运行 sudo tail -f /var/log/apache2/error_log
作为使用 Console.app 的替代方法。使用 tail -f
也会以有效的即时方式更新,而 Console.app 中显示的输出有时会滞后于实际事件,如果您没有看到预期的输出,有时可能需要手动刷新.
PHP 启动错误
最后,要查看 PHP 是否遇到任何错误而不增加网络服务器自身加载过程的复杂性,您可以在命令行上 运行 PHP并查看 PHP 是否在那里发出任何错误。
值得注意的是,在大多数系统上,通过命令行将 PHP 配置为 运行 的方式与在 Apache 中将其配置为 运行 的方式大体相同,特别是关于加载哪些扩展模块,但如果您的系统配置不同,您可能需要结合使用检查 Web 服务器的错误日志输出以及 运行ning [=138= 的输出] 直接在命令行确保所有加载errors/conflicts已经完全解决
运行 PHP 带有 -v
标志以获取 PHP 打印其当前构建信息通常是查看正在发生的事情的快速方法,并且不在 REPL 模式下保留 PHP 二进制文件(等待用户输入):
php -v
如果您在 php.ini
中配置的任何 PHP 模块(扩展)或通过 php.ini
加载的另一个 .ini
文件出现问题加载,您应该会在 PHP 打印的版本信息上方看到错误输出到控制台。例如,您可能会看到这样的内容:
Warning: PHP Startup: sodium: Unable to initialize module
Module compiled with build ID=API20131226,NTS,debug
PHP compiled with build ID=API20131226,NTS
These options need to match
in Unknown on line 0
PHP 5.6.20 (cli) (built: Apr 14 2016 14:23:48)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with XCache v3.2.0, Copyright (c) 2005-2014, by mOo
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans
with XCache Cacher v3.2.0, Copyright (c) 2005-2014, by mOo
由于构建设置之间的冲突,您可以在上方看到与加载 libsodium
(sodium
) PHP 扩展模块相关的错误。在此示例中,为了说明潜在的冲突,PHP 之前已使用 --with-debug
标志安装,而重新安装的版本缺少此设置。另一种选择是从源代码重新安装和重建 PHP,同时启用调试选项 (brew reinstall php56 --build-from-source --with-debug
)。
虽然模块冲突的原因各不相同,但您通常会发现使用 Homebrew 重新安装任何受影响的 PHP 扩展模块包(一旦 PHP 本身已重新安装)将解决冲突。在这种情况下,我 运行 以下命令重新安装 PHP libsodium
软件包:
brew reinstall php56-sodium
模块安装完成后,当我重新运行 php -v
时,与加载此模块相关的错误不再存在,我能够确认libsodium
扩展模块已通过检查 php -m
的输出成功加载到 PHP(告诉 PHP 列出所有加载的模块),然后我使用 grep "sodium"
(完整命令为 php -m | grep "sodium"
)在这种情况下仅显示 php -m
中包含字符串 sodium
.
您可以替换上面命令中遇到问题的特定 PHP 扩展模块,例如将 sodium
换成 opcache
,等等
PHP 未通过 Homebrew 安装模块扩展
请注意,如果您在使用 Homebrew 之外安装了额外的 PHP 扩展模块,例如来自 PHP PECL 存储库的扩展,则可能还需要重新安装其中的一个或多个通过 Homebrew 重新安装 PHP 后的附加模块。您应该查阅这些附加模块的安装说明,以确定如何最好地重新安装它们。