自制软件 - 升级 php 破坏了 php 5.6 依赖

old*_*cho 12 php homebrew

我使用自制软件在本地主机上安装了多个版本的 PHP:

  • 标准核心 php 包 (v7.3.12)
  • php 5.6 来自 exolnet/homebrew-deprecated

现在,当我最近将 php 升级到 7.3.12 时,它升级了 php@5.6 所需的依赖项,现在我收到此错误:

dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
  Referenced from: /usr/local/Cellar/php@5.6/5.6.40/bin/./php
  Reason: image not found
[1]    83775 abort      ./php
Run Code Online (Sandbox Code Playgroud)

当我导航到时,/usr/local/opt/openssl/lib/我看到我现在已经libcrypto.1.1.dylib安装了升级版。

我试过brew upgrade并重新安装 php@5.6 但没有任何乐趣。

有人有建议吗?我真的需要在我的本地主机上运行两个版本的 php 才能继续开发。

Wil*_*nes 1

根据我的经验,尝试通过自制程序管理多个 PHP 版本绝对是 PITA,而且我认为我还没有达到可以轻松并排使用两个版本的地步(直到现在!)。还支持扩展,其详细信息将在本答案后面提供。

也就是说,我找到了一个指南,其中提供了一些有关如何使其工作的说明,并且它的工作绝对是一种享受:

链接的指南在 Apache 中运行 PHP 的上下文中引用了此方法,因此如果这是您的用例,那么这对您来说也是一个不错的小奖励。

现在,因为仅仅在 StackOverflow 上发布链接作为答案还不够,所以我按照下面的顺序详细介绍了您需要遵循的主要步骤。Homebrew 在 Apple Silicon 硬件与 Intel 上使用不同的路径,因为它当然如此,所以如果我错过了任何路径更改,请告诉我,以便我可以更新我的答案。

对于遵循本指南但尚未安装先决条件的任何人,请确保您已安装 Xcode 命令行工具和 Homebrew 并且是最新的。

如果您想检查 Homebrew 是否有任何问题,您可以运行

brew doctor
Run Code Online (Sandbox Code Playgroud)

确保安装了 OpenSSL 也不是一个坏主意,特别是在 macOS Monterey 上重新开始时:

brew install openssl
Run Code Online (Sandbox Code Playgroud)

那么,让我们开始吧。

重置您的环境

首先,更新所有内容,然后升级:

brew update
brew upgrade
brew cleanup
Run Code Online (Sandbox Code Playgroud)

原因是:“这实际上会‘迁移’核心 PHP 包(这是唯一受支持的包),但是使用了一堆符号链接,可能会导致问题出现,因此升级后,我们将删除所有PHP 软件包,提供新的开始”

完成后,检查实际安装的内容:

brew list | grep php
Run Code Online (Sandbox Code Playgroud)

然后删除您找到的所有内容,例如:

brew uninstall --force php56 php56-apcu php56-opcache php56-xdebug
brew uninstall --force php70 php70-apcu php70-opcache php70-xdebug
brew uninstall --force php71 php71-apcu php71-opcache php71-xdebug
brew uninstall --force php72 php72-apcu php72-opcache php72-xdebug
brew cleanup
Run Code Online (Sandbox Code Playgroud)

仔细检查没有剩下什么:

brew list | grep php
Run Code Online (Sandbox Code Playgroud)

并清理所有旧的配置文件:

英特尔:

rm -Rf /usr/local/etc/php/*
Run Code Online (Sandbox Code Playgroud)

苹果芯片:

rm -Rf /opt/homebrew/etc/php/*
Run Code Online (Sandbox Code Playgroud)

如果exolnet/deprecated安装了水龙头,您需要先使用以下方法将其卸下

brew untap exolnet/deprecated
Run Code Online (Sandbox Code Playgroud)

如果你不这样做,你可能会遇到一些奇怪的冲突

添加新的点击并安装

然后我们将利用一个不同的存储库。该存储库预构建了许多版本的 PHP,它们可能适合您,也可能不适合您,但是安装应该要快得多,因为我们不必从源代码进行编译。

brew tap shivammathur/php
Run Code Online (Sandbox Code Playgroud)

然后您可以安装您需要的任何 PHP 版本:

brew install shivammathur/php/php@7.0
brew install shivammathur/php/php@7.1
brew install shivammathur/php/php@7.2
brew install shivammathur/php/php@7.3
brew install shivammathur/php/php@7.4
brew install shivammathur/php/php@8.0
Run Code Online (Sandbox Code Playgroud)

在撰写本文时,此存储库有可供安装的版本 5.6 到 8.1

这些php.ini文件位于以下目录中:

英特尔:

/usr/local/etc/php/7.0/php.ini
/usr/local/etc/php/7.1/php.ini
/usr/local/etc/php/7.2/php.ini
/usr/local/etc/php/7.3/php.ini
/usr/local/etc/php/7.4/php.ini
/usr/local/etc/php/8.0/php.ini
Run Code Online (Sandbox Code Playgroud)

苹果芯片:

/opt/homebrew/etc/php/7.0/php.ini
/opt/homebrew/etc/php/7.1/php.ini
/opt/homebrew/etc/php/7.2/php.ini
/opt/homebrew/etc/php/7.3/php.ini
/opt/homebrew/etc/php/7.4/php.ini
/opt/homebrew/etc/php/8.0/php.ini
Run Code Online (Sandbox Code Playgroud)

链接您想要的版本

到达此处后,关闭并重新打开已打开的所有终端窗口,以避免出现奇怪的路径问题。

现在,这些版本已安装,但未链接。例如,要切换到 PHP 7.3,请运行以下命令:

brew unlink php && brew link --overwrite --force php@7.3
Run Code Online (Sandbox Code Playgroud)

然后检查我们是否有正确的版本:

php -v
Run Code Online (Sandbox Code Playgroud)

如果我们想切换到 PHP 7.4:

brew unlink php && brew link --overwrite --force php@7.4
Run Code Online (Sandbox Code Playgroud)

然后检查我们是否有正确的版本:

php -v
Run Code Online (Sandbox Code Playgroud)

更轻松的切换

如果您想要更快地切换 PHP 版本,请查看rhukster的sPHP 脚本

您可以通过运行以下命令来安装它:

英特尔:

curl -L https://raw.githubusercontent.com/rhukster/sphp.sh/main/sphp.sh > /usr/local/bin/sphp chmod +x /usr/local/bin/sphp
Run Code Online (Sandbox Code Playgroud)

苹果芯片:

curl -L https://raw.githubusercontent.com/rhukster/sphp.sh/main/sphp.sh > /opt/homebrew/bin/sphp
chmod +x /opt/homebrew/bin/sphp
Run Code Online (Sandbox Code Playgroud)

并使用以下命令执行它:

sphp 8.0
Run Code Online (Sandbox Code Playgroud)

当然,对于像这样的 YMMV 之类的事情,但这应该是一个很好的起点,并真正帮助你到达你需要的地方并消除一些头痛。

那么扩展呢?

嗯,我很高兴你问了。对于更高版本,pecl 确实可以工作。然而,例如,如果您想安装 5.6 的 xdebug,pecl 就会把它的玩具从婴儿车里扔出来。

您可以点击另一个存储库,专门用于扩展:

brew tap shivammathur/extensions
Run Code Online (Sandbox Code Playgroud)

完成此操作后,就像运行一样简单:

brew install xdebug@5.6
brew install xdebug@8.1
Run Code Online (Sandbox Code Playgroud)

上面的链接详细介绍了可用扩展的列表。我不会将它们包含在这里,因为它是一个动态列表,很快就会过时,但它们中的大多数支持 5.6 到 8.1

包起来

我自己遵循了这个过程,这是我尚未找到的在 macOS 上管理多个 PHP 版本的最简单方法。请随意运行brew doctor,brew cleanup在此过程中的任何时候,它毕竟不会造成伤害,而且实际上可能有助于调试您遇到的任何问题。也就是说,我的环境绝对是一团糟,大约十分钟就收拾好了。对我来说,这个过程中最长的一步是更新 Homebrew 本身。