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

Posted

技术标签:

【中文标题】Homebrew 安装的 PHP7 不适用于 macOS 上的 Apache【英文标题】:PHP7 installed by Homebrew doesn't work with Apache on macOS 【发布时间】:2017-01-20 05:28:40 【问题描述】:

我正在尝试升级到通过自制软件安装的 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

【问题讨论】:

这里的问题是,“问题加载页面”说什么?此外,您是否查看过您的 apache 访问和错误日​​志?当你调用你的页面时它会说什么? 今晚晚些时候我会进一步更新这个问题! @BjörnK @arthur 澄清一下,我下载了您的 httpd.conf 并对其进行了测试;我的回答是基于你的 httpd.conf(我把phpinfo() 调用放在默认的/Library/WebServer/Documents 中)。我会特别注意includes 中的任何内容,例如 vhosts.conf,以及任何可能妨碍您的 .htaccess 文件。添加这些可能有助于解决问题。 【参考方案1】:

确保:

您已按照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。

分步教程见:Setup Apache, mysql and PHP using Homebrew on macOS Sierra。

疑难解答

当出现问题时,通过以下方式实时检查日志:

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

然后启动/重启服务器。

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

【讨论】:

即使在加载 libphp7.so 后我也被卡住了。添加SetHandler application/x-httpd-php 让我启动并运行。投赞成票。【参考方案2】:

虽然Homebrew 是一个出色的工具,但有时却没有必要。

我在Installing Apache, PHP, and MySQL on Mac OS X 上的帖子中提到,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 文件。两者都在他们的FAQ 中进行了概述。

如果您想要更详细的分步教程,请查看我最近在 Updating PHP on Mac OS X 上的帖子。

【讨论】:

虽然几年前这是一个很好的答案,但 Liip 已停止更新版本,目前停滞在 7.3。所以我不得不删除它,现在我被困在试图让默认的 Apache 服务器镜像我在 Homestead 中的 PHP 设置。非常令人沮丧。【参考方案3】:

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

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

尝试使用标志重新安装:

brew reinstall php70 --with-apache

【讨论】:

--with-apache 选项已弃用,请改用--with-httpd24【参考方案4】:

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

LoadModule php5_module libexec/apache2/libphp5.so

【讨论】:

它已从 macOS 12 及更高版本中删除,因此据我所知,这将不再有效。【参考方案5】:

运行$ 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

我可以确认this workaround posted on github,安装不支持 LDAP 的包将防止此错误:

brew reinstall php70 --without-ldap

【讨论】:

明天会试一试,如果它为我解决问题,将奖励赏金,谢谢。 我重新安装了没有 ldap 的 brew 并且 apachectl -t 返回语法 OK,但我仍然遇到同样的问题。 @arthur Darn。我不确定我是否可以对您提供的信息提供更多帮助,因为这对我来说效果很好。如果您发现任何有趣的事情,您应该查看一些错误日志 - apache 和 php 以及 edit 您的问题。【参考方案6】:

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

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

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

【讨论】:

我实际上一直在使用 docker,这让我不得不使用 git 很烦人,当 55/56 运行良好时无法设置 php7 真是令人沮丧。跨度> 我使用 git,我将源代码检查到主驱动器上的路径,然后将 docker 容器中的挂载点设置为该文件夹,对我来说一切正常【参考方案7】:

您可以将 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.

您需要按照教程here 或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

【讨论】:

CA 部分在 Mac Monterrey M1 苹果芯片上成功了。谢谢拉维【参考方案8】:

我今天发现了一个在 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

【讨论】:

【参考方案9】:

我从 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 后,我已启动并运行。

【讨论】:

【参考方案10】:

我知道这是一个很老的话题,但是当您更新 PHP 时,您还需要更新 Apache 配置 - 例如:

LoadModule php5_module libexec/apache2/libphp5.so

改为:

LoadModule php7_module libexec/apache2/libphp7.so

【讨论】:

【参考方案11】:

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

【讨论】:

以上是关于Homebrew 安装的 PHP7 不适用于 macOS 上的 Apache的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Homebrew 在 macOS Big Sur 上安装 PHP 7.2?

Codeigniter 3 会话不适用于 PHP 7.1.4

Codeigniter 会话不适用于 PHP 7

查询字符串参数不适用于我的 wordpress 项目

Codeigniter 4 不适用于带有 PHP 8.0 的 xampp

安装Valet记录,配置全局环境变量。