Приветствую, мой читатель!

На днях, после обновления системы Linux (Ubuntu 18.04) я столкнулся с проблемой совместимости версий языка программирования PHP.

В чем была выражена проблема? В системе на локальном была установлена версия php 7.2 (о да, это круто, новая версия), но на внешнем сервере была установлена версия php 7.0. А мне нужна такая же версия интерпретатора как у хостинга для разработки и тестирования сайтов.

Вроде бы проблема изначально неочевидна, т. к. в composer указана версия 7.0… и выше, кроме этого, используемая версия фреймворка Laravel 5.5 также работает с версией 7.0. Но composer затянул версии пакетов для новой версии языка, т. е. php 7.2 и соответственно, на сервере ничего не заработало (установить на сервере нужную версию интерпретатора на используемом тарифе нельзя).

В итоге, нужно было понизить версию php 7.2 до версии 7.0. В этой статье мы узнаем как сменить версию php, это будет продемонстрировано на примере версий 7.2 и 7.0, но решение подойдет для всех стабильных и новых версий php.

Установка старой версии php (понижений версии php)

Я нашел два решения (точнее одно, но с разными ветками).

Одно рассчитывало на постоянную смену интерпретатора, второе — замена версии php с возможностью переключения версий php, например с 7.2 на 7.0, с 7.0 на 5.6.

Начальные пункты установки предыдущих версий php не отличаются.

В терминале выполняем следующие команды:

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

Так мы подключили репозитории launchpad.net и пополнили список наших пакетов всеми стабильными версиями php и последней версией php. На октябрь 2018 года, это версии 5.6, 7.0, 7.1, 7.2 и RC (кандидат релиза) 7.3.

Теперь вы можете установить необходимые версии php. Например, для установки php 7.0 на Ubuntu 18.04 нужно выполнить следующие команды:

sudo apt-get install php7.0 php7.0-cli php-mbstring php7.0-mbstring libapache2-mod-php7.0 php7.0-mysql 

Конечно, кому-то понадобятся еще другие пакеты, но о них вы узнаете из предупреждений при запуске composer или php.

После установки новой (старой) версии php, нужно выполнить переключение текущего интерпретатора с одной версии на другую. Иначе, вы все еще работаете с версией php по умолчанию и не получите нужного эффекта.

Переключение версий php

Для переключения версий php работающем на Apache (если все работает через браузер):

sudo a2dismod php7.2 ; sudo a2enmod php7.0 ; sudo service apache2 restart

Результат выполнения данной команды вы увидите при исполнении скрипта php с функцией phpinfo().

Для переключения версий на CLI (командной строке, если работаете с php и терминала, например с composer, artisan и т.п.):

sudo update-alternatives --set php /usr/bin/php7.0

Результат изменения версии можно проверить при помощью команды php -v.

Выше показан пример на изменении версии php 7.2 на 7.0. Для ваших же версий, подставляйте свои номера.

Для изменения версий обратно, проделайте те же команды, но с другими номерами версий.

Возможные проблемы при изменении версий php

 Installation request for PHP extension 

Первое, с чем я столкнулся, это php ругался на отсутствие библиотек для текущей версии.

Пример вывода из терминала:

Problem 1
 - Installation request for magento/product-enterprise-edition 2.0.2 -> satisfiable by magento/product-enterprise-edition[2.0.2].
 - magento/product-enterprise-edition 2.0.2 requires ext-gd * -> the requested PHP extension gd is missing from your system.

To enable extensions, verify that they are enabled in those .ini files:

- /etc/php5/cli/php.ini
- /etc/php5/cli/conf.d/05-opcache.ini
- /etc/php5/cli/conf.d/10-pdo.ini
- /etc/php5/cli/conf.d/20-curl.ini
- /etc/php5/cli/conf.d/20-imap.ini
- /etc/php5/cli/conf.d/20-json.ini
- /etc/php5/cli/conf.d/20-mcrypt.ini
- /etc/php5/cli/conf.d/20-pdo_pgsql.ini
- /etc/php5/cli/conf.d/20-pgsql.ini
- /etc/php5/cli/conf.d/20-pspell.ini
- /etc/php5/cli/conf.d/20-readline.ini

You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

Но, в этом выводе указано, какие команды нужно сделать и какие пакеты установить. На текущий момент у вас уже скорее всего установлены пакеты с такими именами, но они не совпадают в номере версии с используемой версией php.

Composer требует другие пакеты

Вторая проблема, это если вы установили пакеты через composer с предыдущей установленной версией языка, то и зависимости подтянулись к ним. Это значит, вам просто нужно выполнить команду composer update.

Так вы получите все нужные пакеты под текущую версию php.

Постоянная смена версий интерпретатора php

Второе найденное решение, про которое я писал выше, основывалось на тех же принципах (установки php), но проблема была другой: запускать скрипты php с разными версиями php.

Как вы могли догадаться, ответ уже написан выше: нужно перед запуском скрипта изменять версию PHP командами sudo a2dismod php7.2 ; sudo a2enmod php7.0 и sudo update-alternatives --set php /usr/bin/php7.0.

Конечно, каждый раз вводить такие длинные команды неудобно, поэтому создайте aliase в bash и выполняйте данную команду через алиас.

Еще одно решение: использование виртуальных машин для разных версий php. Оно может быть менее интересное, для слабых компьютеров или кто не хочет заморачиваться с виртуалками.

Ответы и примеры решений были найдены тут:

https://askubuntu.com/questions/761713/how-can-i-downgrade-from-php-7-to-php-5-6-on-ubuntu-16-04/762161#762161

https://stackoverflow.com/questions/35815376/to-enable-extensions-verify-that-they-are-enabled-in-those-ini-files-vagrant