繁体   English   中英

Homebrew 安装的 PHP7 不适用于 macOS 上的 Apache

[英]PHP7 installed by Homebrew doesn't work with Apache on macOS

我正在尝试升级到我通过自制软件安装的 php7。

在 CLI 中 php -v 返回

PHP 7.0.10 (cli) (built: Aug 21 2016 19:14:33) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

但是对于localhost,firefox弹出加载页面有问题,无法查看localhost/phpinfo.php; 如果我将模块行换回 php5,它就可以正常工作。

这是我的 apache2/httpd.conf 的 pastebin http://pastebin.com/950yC7wA ,我不知道如何解决这个问题。

  • osx 版本 El Capitan 10.11

确保:

  • 您已按照brew info php@7.1的说明进行操作:

     ==> Caveats To enable PHP in Apache add the following to httpd.conf and restart Apache: LoadModule php7_module /usr/local/opt/php@7.1/lib/httpd/modules/libphp7.so <FilesMatch \\.php$> SetHandler application/x-httpd-php </FilesMatch> Finally, check DirectoryIndex includes index.php DirectoryIndex index.php index.html
  • 您通过sudo apachectl restart重新启动了 Apache。

有关分步教程,请参阅: 在 macOS Sierra 上使用 Homebrew 设置 Apache、MySQL 和 PHP

故障排除

  • 当某些事情不起作用时,请通过以下方式实时检查日志:

     tail -f /usr/local/var/log/apache2/*error*

    然后启动/重启服务器。

    注意:完成后,按Control - C退出tail

虽然Homebrew是一个很好的工具,但有时它是不必要的。

我在关于在 Mac OS X安装 Apache、PHP 和 MySQL 的帖子中提到,OS X 预装了 Apache 和 PHP。 因此,您只需配置和启用它们。

不幸的是,从 Mac OS 10.11 ( El Capitan ) 开始,PHP 版本仍然是 5.5。 我想这会随着 10.12 ( Sierra ) 而改变,因为 PHP 5.5 是 EOL。 但是,它可能只是 PHP 5.6。

要安装 PHP 7,我建议使用PHP OSX 他们为 PHP 版本 5.3 到 7.1(最新)提供软件包安装。 它适用于 Mac OS 10.6+ ( Snow Leopard )。

因为它是一个包安装,所以它可以使用默认的 Apache 安装开箱即用。 你只需要更新你的PATH并修改他们的 PHP ini 文件。 两者都在他们的常见问题解答中进行了概述。

如果您想要更多的分步教程,请查看我最近关于在 Mac OS X更新 PHP 的帖子。

如果您在 OS X Sierra 上使用 Apache,默认情况下 php7 不再附带 apache 模块。

随着 macOS Sierra 的发布,Apache 模块现在不是默认构建的。 如果你想在你的系统上构建它,你必须使用 --with-apache 选项安装 php。 有关更多详细信息,请参阅 brew 选项 php70。

尝试使用标志重新安装:

brew reinstall php70 --with-apache

我遇到了同样的问题,当我在/etc/apache2/httpd.conf注释掉这一行时它就消失了

LoadModule php5_module libexec/apache2/libphp5.so

运行$ apachectl -t将显示您当前配置的任何问题。 当我运行它时,我得到了这个:

httpd:/private/etc/apache2/httpd.conf 第 171 行的语法错误:无法将 /usr/local/opt/php70/libexec/apache2/libphp7.so 加载到服务器中:dlopen(/usr/local/opt/php70 /libexec/apache2/libphp7.so, 10):找不到符号:_ldap_control_find \\n 引用自:/usr/local/opt/php70/libexec/apache2/libphp7.so\\n 预期在:/System/Library/Frameworks/ LDAP.framework/Versions/A/LDAP\\n 在 /usr/local/opt/php70/libexec/apache2/libphp7.so

我可以确认发布在 github 上的此解决方法,安装没有 LDAP 支持的包将防止出现此错误:

brew reinstall php70 --without-ldap

不是您问题的直接解决方案,但我在 OS X 上遇到了无数的 php 问题。最近,我试图在升级到 El Capitan 后让 OCI 库正常工作。

我现在已经放弃尝试使用它并开始使用 docker 进行我的开发。 我发现它是一个更好的解决方案,您甚至可以在同一代码库上设置多个环境,这对于测试不同版本非常有用。

在 OS X 上安装 Docker 真的很容易,并且在存储库中有大量可用的预构建容器,您只需安装并将挂载点设置到源目录并使用它提供的端口即可访问。

我今天发现了一个新路径来加载 httpd.conf 文件(/usr/local/etc/httpd/httpd.conf)中的不同 php 库:

### OLD VERSION (NOT WORKING NOW)  ###
#LoadModule php5_module    /usr/local/opt/php56/libexec/apache2/libphp5.so
#LoadModule php7_module    /usr/local/opt/php70/libexec/apache2/libphp7.so
#LoadModule php7_module    /usr/local/opt/php71/libexec/apache2/libphp7.so
#LoadModule php7_module    /usr/local/opt/php72/libexec/apache2/libphp7.so

### NEW VERSION ###
#LoadModule php5_module    /usr/local/opt/php56/lib/httpd/modules/libphp7.so
#LoadModule php7_module    /usr/local/opt/php70/lib/httpd/modules/libphp7.so
#LoadModule php7_module    /usr/local/opt/php71/lib/httpd/modules/libphp7.so
LoadModule php7_module    /usr/local/opt/php72/lib/httpd/modules/libphp7.so

我知道这是一个非常古老的话题,但是当您更新 PHP 时,您还需要更新 Apache confing - 例如:

LoadModule php5_module libexec/apache2/libphp5.so

更改为:

LoadModule php7_module libexec/apache2/libphp7.so

对于可能遇到此问题的人,请确保您能够使用“apachectl restart”重新启动 apache。 就我而言,我必须首先使用命令“httpd stop”停止 httpd 的所有进程,然后使用“apachectl start”启动 apache。

我从 PHP 5.6 升级到 7.2 时遇到了类似的问题。

在 httpd.conf 中注释掉LoadModule php5_module /usr/local/php5/libphp5.so并取消注释LoadModule php7_module /usr/local/Cellar/php@7.2/7.2.22_1/lib/httpd/modules/libphp7.so

对我有用的真正技巧是当我运行以下命令来找出 Apache 加载的所有模块时:

sudo /usr/sbin/httpd -t -D DUMP_MODULES

这是我发现 php7 和 php5 都被加载的地方。 在查看文件后,有一个额外的 conf 引用了 php5。

删除该引用并重新启动 apache 后,我就启动并运行了。

您可以将 brew php 模块添加到 MacOS Monterey apache。 正确执行所有步骤。

安装 homebrew php (brew install php / brew install php@7.4) 并在 /etc/apache2/httpd.conf 中添加以下几行后

LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so
#LoadModule php7_module /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so


<FilesMatch \.php$>
        SetHandler application/x-httpd-php
</FilesMatch>

重要提示:您需要通过运行以下命令来测试 apache2 配置。 如果你不运行它,你永远不会明白为什么它不起作用。

sudo apachectl configtest

如果你得到一个错误,没有像下面这样的代码签名权限

[so:error] [pid 69894] AH06665: No code signing authority for module at /.../libphp[7].so specified in LoadModule directive.

您需要按照此处的教程或https://blog.phusion.nl/2020/12/22/future_of_macos_apache_modules/创建本地 CA 文件和证书,并使用以下命令对 libphp.so 文件进行签名。 注意:用您的证书名称替换 Ravi

codesign -s "Ravi" --force --keychain ~/Library/Keychains/login.keychain-db /opt/homebrew/opt/php/lib/httpd/modules/libphp.so
# codesign -s "Ravi" --force --keychain ~/Library/Keychains/login.keychain-db /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so

现在回到 /etc/apache2/httpd.conf 并像这样在 LoadModule 行的末尾添加“Ravi”(您的证书名称)

LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so "Ravi"
#LoadModule php7_module /opt/homebrew/opt/php@7.4/lib/httpd/modules/libphp7.so "Ravi"

做完之后运行

sudo apachectl configtest

你应该看到最后(忽略通知行)

Syntax OK

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM