Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

homebrew - upgrade php broke php 5.6 dependency

Tags:

php

homebrew

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 [email protected] 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/[email protected]/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 [email protected] but no joy.

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

like image 760
oldo.nicho Avatar asked Dec 04 '19 07:12

oldo.nicho


1 Answers

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/[email protected]
brew install shivammathur/php/[email protected]
brew install shivammathur/php/[email protected]
brew install shivammathur/php/[email protected]
brew install shivammathur/php/[email protected]
brew install shivammathur/php/[email protected]

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 [email protected]

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 [email protected]

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/adc8c149876bff14a33e3ac351588fdbe8172c07/sphp.sh > /usr/local/bin/sphp
chmod +x /usr/local/bin/sphp

Apple Silicon:

curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw/adc8c149876bff14a33e3ac351588fdbe8172c07/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/extensions

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

brew install [email protected]
brew install [email protected]

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.

like image 125
Will Jones Avatar answered Nov 19 '22 08:11

Will Jones