Httpd libphp5.so ldap错误

时间:2016-04-05 02:00:00

标签: php apache homebrew osx-yosemite

  

由Julz解决

     

谢谢!

$ 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通过Homebrew / homebrew-php tap < php56 --with-homebrew-apxs --with-apache --with-homebrew-curl --with-homebrew-openssl 安装< / p>

他们都安装正确,我在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

我不能为我的生活弄清楚什么是错的,有什么帮助吗?没有php lib,Apache工作正常。

2 个答案:

答案 0 :(得分:13)

我今天通过自制程序升级了php56并且有相同的pb。它似乎与ldap支持有关。

在提供修复之前,我建议卸载php56,然后重新安装而不使用ldap

$ brew uninstall php56
$ brew install php56 --without-ldap

简单快捷。

答案 1 :(得分:7)

对于遇到此问题的任何其他人,无法禁用LDAP支持,因为他们正在处理的项目需要它,另一种方法是让Homebrew通过从源代码构建PHP来重新安装PHP,我在下面描述的以及一些技巧,我发现这些技巧多年来一般用于调试与PHP相关的问题并将PHP加载到Web服务器环境中(在本例中为Apache)。我希望下面的信息对其他人有用,并为其他人节省了解决这个问题的时间。

对于许多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子命令更改为{{1在执行install语义正确之后,uninstall命令无论是否已安装包都都能正常工作。

重新安装PHP

后重新安装PHP扩展模块

我还发现有必要重新安装我安装的其他PHP模块包(例如OPCache),在重新安装PHP 5.6之后通过从源代码构建来运行相关的reinstall

您可以通过运行brew reinstall php56-<module>来查看通过Homebrew安装的其他PHP模块包。简单地重新安装它们应该是安全的,您可以通过运行以下命令轻松完成:

brew list | grep php

如果您希望在重新安装的内容中更具针对性,您应该能够通过查看启动Web服务器的输出,查看Web服务器日志来查看哪些PHP模块无法加载(如果存在任何冲突) ,或者查看在命令行上简单地调用PHP二进制文件的输出(假设您的路径设置正确,指向您刚刚使用Homebrew安装的PHP版本,通常是这样)。

有关这些地方寻找调试信息的一些注意事项可以在下面找到:

Apache HTTPD启动调试输出

要查看在OS X上启动Apache的详细输出,您可以运行以下命令:

brew list | grep php56 | xargs -I{} brew reinstall {}

这是运行sudo httpd -k restart -e debug的替代方法,sudo apachectl restart是围绕httpd二进制文件的包装脚本 - -k restart选项告诉httpd执行哪个函数(在本例中为restart - 您可以通过运行man httpd来查看所有支持的选项,并且-e标志允许您设置详细级别 - 默认值是有效的静默。将-e设置为debug级别可提供最高级别的输出,因此如果在加载其中一个已配置的Apache模块时出现问题,您将在运行上述命令的输出中看到它。因此,如果您发现Apache实例未按预期工作,这通常是一个很好的起点。

OS X上的Apache HTTPD错误日志

要查看OS X上的Apache日志,请打开Console.app(可在/Applications/Utilities/文件夹中找到)并展开日志列表侧栏中的/var/log/apache2/文件夹,然后选择error_log文件。在这里你应该看到Apache加载时的其他输出(从控制台运行sudo httpd -k restart -e debug命令时打开Console.app很好。)

如果PHP本身在加载任何模块时遇到问题,您应该在Console.app的error_log中看到与此相关的这些错误。

您还可以打开另一个终端/控制台窗口并运行sudo tail -f /var/log/apache2/error_log作为使用Console.app的替代方法。使用tail -f也会以有效的瞬时方式进行更新,而Console.app中显示的输出有时会落后于实际事件,如果您没有看到预期的输出,有时可能需要手动刷新

PHP启动错误

最后,要查看PHP是否遇到任何错误而没有添加Web服务器自身加载过程的复杂性,您可以在命令行上运行PHP,看看PHP是否在那里发出任何错误。 / p>

值得注意的是,在大多数系统上,PHP配置为通过命令行运行以及如何配置为在Apache中运行的方式通常是相同的,特别是关于加载哪些扩展模块,但是如果您的系统如果配置不同,您可能需要结合使用检查Web服务器的错误日志输出以及直接在命令行上运行PHP的输出,以确保所有加载错误/冲突都已完全解决。

使用-v标志运行PHP以使PHP打印其当前构建信息通常是查看正在发生的事情的一种很好的快速方法,并且不会将PHP二进制文件保留在REPL模式中(等待用户输入):

php -v

如果您在php.ini或通过.ini加载的其他php.ini文件中配置的任何PHP模块(扩展程序)加载有问题,您应该会看到错误输出到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

由于构建设置之间存在冲突,您可以在上面看到与加载libsodiumsodium)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

未通过Homebrew安装的PHP模块扩展

请注意,如果您在使用Homebrew之外安装了其他PHP扩展模块,例如PHP PECL存储库中的扩展,则在通过Homebrew重新安装PHP后,可能还需要重新安装一个或多个这些附加模块。您应该查阅这些附加模块的安装说明,以确定如何最好地重新安装它们。