简体   繁体   中英

homebrew - upgrade php broke php 5.6 dependency

I have multiple versions of PHP installed on my localhost using homebrew:

  • the standard core php package (v7.3.12)
  • php 5.6 from exolnet/homebrew-deprecated

Now when I upgraded php to 7.3.12 recently it upgraded a dependency that php@5.6 requires and now I am getting this error:

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

And when I navigate to /usr/local/opt/openssl/lib/ I see that I now have the upgraded libcrypto.1.1.dylib installed.

I've tried brew upgrade and reinstalling php@5.6 but no joy.

Does anyone have a suggestion? I really need both versions of php working on my localhost to continue development.

From my experience, trying to manage multiple PHP versions via homebrew is an absolute PITA, and I don't think I've ever got to the point where I can easily have both versions available side by side (until now!). Extensions are also supported, the details of which are provided later on in this answer.

That said, I have found a guide that gives some instructions on how to get this working and it works an absolute treat:

The linked guide references this method in the context of running PHP within Apache, so if that's your use case that's a nice little bonus for you too.

Now, because just posting links as answers on StackOverflow just isn't the done thing, I've detailed the main steps you need to follow in order below. Homebrew uses different paths on Apple Silicon hardware vs Intel because of course it does, so if I've missed any path changes please let me know so I can update my answer.

For anyone following this guide that doesn't yet have the prerequisites installed, ensure you have the Xcode command line tools and Homebrew installed and up to date.

If you want to check Homebrew for any issues, you can run

brew doctor

It's also never a bad idea to ensure that you have OpenSSL installed, especially if starting a fresh on macOS Monterey:

brew install openssl

So, let's get started.

Reset your environment

First, update everything then upgrade:

brew update
brew upgrade
brew cleanup

The reason for this is: "This will actually 'migrate' the core PHP packages (which are the only ones supported), but there's a bunch of symlinks utilized that could cause problems down the road, so after upgrading, we'll remove all PHP packages, to provide a fresh start"

Once you've done that, check what's actually installed:

brew list | grep php

Then remove whatever you find, for example:

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

Double check there's nothing left:

brew list | grep php

and clean up any old configuration files:

Intel:

rm -Rf /usr/local/etc/php/*

Apple Silicon:

rm -Rf /opt/homebrew/etc/php/*

If have the exolnet/deprecated tap installed, you'll need to remove it first using

brew untap exolnet/deprecated

If you don't, you can get some weird conflicts

Add the new Tap and Install

We're then going to tap a different repository . This repository has many versions of PHP pre-built which may or may not work for you, however installation should be much faster as we don't have to compile from source.

brew tap shivammathur/php

You can then install any PHP versions you require:

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

At the time of writing, this repository has versions 5.6 through 8.1 available for installation

The php.ini files are located in the following directories:

Intel:

/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

Apple Silicon:

/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

Link your desired version

Once you've got here, close and reopen any terminal windows you have open to avoid strange path issues.

Now, these versions are installed, but not linked. To switch to PHP 7.3 for example, run the following command:

brew unlink php && brew link --overwrite --force php@7.3

And then check we have the correct version:

php -v

If we want to switch to PHP 7.4:

brew unlink php && brew link --overwrite --force php@7.4

And then check we have the correct version:

php -v

Easier Switching

If you want a faster way of switching PHP versions, check out the sPHP script from rhukster

You can install this by running:

Intel:

curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw/791fda77946ab2dbd053d7f27e9237aaf7392c4b/sphp.sh > /usr/local/bin/sphp
chmod +x /usr/local/bin/sphp

Apple Silicon:

curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw/791fda77946ab2dbd053d7f27e9237aaf7392c4b/sphp.sh > /opt/homebrew/bin/sphp
chmod +x /opt/homebrew/bin/sphp

and execute it using:

sphp 8.0

Of course, with anything like this YMMV, but this should hopefully be a good starting point and actually get you where you need to be and remove some headaches.

What about extensions?

Well I'm glad you asked. For the later versions, pecl does work. However, if you want to install xdebug for 5.6 for example, pecl throws its toys out of its pram.

There is another repository you can tap, specifically for extensions:

brew tap shivammathur/php

Once you've done this, it's as simple as running:

brew install xdebug@5.6
brew install xdebug@8.1

The list of available extensions is detailed in the link above. I won't include them here because it's a dynamic list and it'll soon be out of date, but most of them support 5.6 through to 8.1

Wrap up

Having followed this process myself, this is the easiest approach I'm yet to find for managing multiple PHP versions on macOS. Feel free to run brew doctor and brew cleanup at any points during the process, it can't hurt after all and might in fact help with debugging any issues you happen across. That said, my environment was an absolute mess and this tidied it up in about ten minutes. The longest step in this process for me was updating Homebrew itself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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