Как обновить php до нужной версии и привести зависимости к нужной версии

  1. Не обязательно удалять нынешнюю версию Php, можно оставить несколько. Например, как в данном случае:
update-alternatives --list php
/usr/bin/php5
/usr/bin/php7.1
/usr/bin/php7.2
/usr/bin/php7.4
  1. Проверяем, какие зависимости установлены для текущей версии:
dpkg --list | grep php
ii  libapache2-mod-php7.2                7.2.34-54+0~20241224.101+debian12~1.gbpb6068e                              amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  newrelic-php5                        11.5.0.18                                                                  amd64        The New Relic agent for PHP
ii  newrelic-php5-common                 11.5.0.18                                                                  all          Scripts and samples for the New Relic PHP agent
rc  php-apcu                             5.1.19+4.0.11-7+0~20210222.23+debian10~1.gbp08eb57                         amd64        APC User Cache for PHP
ii  php-apcu-bc                          1.0.5-19+0~20230618.29+debian12~1.gbp6ddc4e                                amd64        APCu Backwards Compatibility Module
ii  php-common                           2:95+0~20240927.54+debian12~1.gbpe0084c                                    all          Common files for PHP packages
rc  php-igbinary                         3.2.1+2.0.8-6+0~20210223.25+debian10~1.gbp4f4993                           amd64        igbinary PHP serializer
rc  php-imagick                          3.4.4+php8.0+3.4.4-6+0~20210222.27+debian10~1.gbp25c811                    amd64        Provides a wrapper to the ImageMagick library
rc  php-memcached                        3.1.5+2.2.0-9+0~20210224.28+debian10~1.gbp2db493                           amd64        memcached extension module for PHP, uses libmemcached
rc  php-msgpack                          2.1.2+0.5.7-6+0~20210222.26+debian10~1.gbpcc7388                           amd64        PHP extension for interfacing with MessagePack
ii  php-pear                             1:1.10.13+submodules+notgz+2022032202-2+0~20230612.39+debian12~1.gbpfd4c1d all          PEAR Base System
rc  php-redis                            5.3.2+4.3.0-7+0~20210224.33+debian10~1.gbp893bd4                           amd64        PHP extension for interfacing with Redis
ii  php5-cli                             5.6.40+dfsg-0+deb8u4                                                       amd64        command-line interpreter for the php5 scripting language
  1. Проверяем, какие версии нам доступны для обновления
apt-cache show php7.2
  1. Чтобы узнать, поддерживает ли наша версия Ubuntu/Debian нужный пакет, можно перейти сюда и убедиться, что тут есть нужный пакет
  2. Подключаем необходимые репозиторий для обновления, если нужной версии не нашлось
wget https://packages.sury.org/php/apt.gpg
sudo apt-key add apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php7.list
sudo apt-get update -y
  1. На 3-ем шаге мы получили название пакета, который нам доступен. Копируем его и вставляем:
sudo apt install php7.2=7.2.34-54+0~20241224.101+debian12~1.gbpb6068e
  1. Затем устанавливаем идентичные зависимости, которые установлены для других версий, из 2-ого шага:
sudo apt install php7.2-apcu php7.2-bcmath php7.2-cli php7.2-common php7.2-curl php7.2-fpm php7.2-gd php7.2-gmp php7.2-igbinary php7.2-imagick php7.2-intl php7.2-json php7.2-mbstring php7.2-mcrypt php7.2-memcached php7.2-mongodb php7.2-msgpack php7.2-mysql php7.2-opcache php7.2-readline php7.2-redis php7.2-xml php7.2-zip
  1. Если на сервере установлено несколько версий php, то может возникнуть ситуация, что дефолтной будет самая новая установленная версия:
php -version
PHP 7.4.33 (cli) (built: Dec 24 2024 06:15:56) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies

В таком случае:

sudo update-alternatives --config php
There are 4 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
* 0            /usr/bin/php7.4   74        auto mode
  1            /usr/bin/php5     50        manual mode
  2            /usr/bin/php7.1   71        manual mode
  3            /usr/bin/php7.2   72        manual mode
  4            /usr/bin/php7.4   74        manual mode

Press <enter> to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/php7.2 to provide /usr/bin/php (php) in manual mode

php -version
PHP 7.2.34-54+0~20241224.101+debian12~1.gbpb6068e (cli) (built: Dec 24 2024 06:22:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.34-54+0~20241224.101+debian12~1.gbpb6068e, Copyright (c) 1999-2018, by Zend Technologies
  1. После смены версии не забудь отрестартить сервисы:
sudo systemctl restart php7.2-fpm.service
sudo systemctl restart nginx

Если необходимо понизить версию модулей

Если в процессе деплоя у разработки ошибка вида: Pasted image 20250219122132.png
необходимо понизить версию php-ext redis.

Для начала проверим версию:

php -r "echo phpversion('redis');"

Чтобы это сделать, нужно:

sudo pecl uninstall redis

Проверяем удаление:

php -m | grep redis

Если redis появляется, то нужно проверить файлы по следующим путям и удалить их:

/usr/lib/php/$(php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;")/redis.so
/etc/php/7.2/mods-available/redis.ini

если тут файлы есть, их удаляем.

Проверяем снова и тогда redis должен быть удален полностью:

php -m | grep redis

Ребутаем php-fpm, а затем устанавливаем нужную версию:

sudo pecl install redis-5.3.7

Я получил такую ошибку:

sudo pecl install redis-5.3.7
downloading redis-5.3.7.tgz ...
Starting to download redis-5.3.7.tgz (275,200 bytes)
.........................................................done: 275,200 bytes
31 source files, building
running: phpize
sh: 1: phpize: not found
ERROR: phpize failed

which phpize
phpize -version
-bash: phpize: command not found

sudo apt update && sudo apt install php7.2-dev php-pear -y

После установки phpize:

otulashvili@qa-h1-project [project] :~ $ which phpize
/usr/bin/phpize
otulashvili@qa-h1-project [project] :~ $ phpize -version
Cannot find config.m4. 
Make sure that you run '/usr/bin/phpize' in the top level source directory of the module

Допустим, что это не критичная ошибка :)
Установил нужные зависимости:

sudo apt install libzstd-dev -y

Повторил установку php-redis:

sudo pecl install redis-5.3.7

В конце установки нам дается подсказка, что нужно сделать, чтобы ext заработал:

Build process completed successfully
Installing '/usr/lib/php/20170718/redis.so'
install ok: channel://pecl.php.net/redis-5.3.7
configuration option "php_ini" is not set to php.ini location
You should add "extension=redis.so" to php.ini

Выполняем:

echo "extension=redis.so" | sudo tee -a /etc/php/7.2/cli/php.ini
echo "extension=redis.so" | sudo tee -a /etc/php/7.2/fpm/php.ini

Перезапускаем php-fpm и выполняем команду для проверки версии:

sudo systemctl restart php7.2-fpm

php -r "echo phpversion('redis');"
5.3.7

Добавляем прослушивание нужного порта в установленную php-fpm

После завершения работ обнаружилась ошибка в Openresty:

2025/02/19 14:35:06 [error] 754058#754058: *7886 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 7.2.0". You are running 7.1.33-67+0~20241224.99+debian12~1.gbp513ecc. in /var/www/project/releases/20250219111149/vendor/composer/platform_check.php on line 24" while reading response header from upstream, client: 138.201.175.91, server: cpa.qa, request: "GET /clickhouse/dictionary/vertical/7815696ecbf1c96e6894b779456d330e HTTP/1.1", upstream: "fastcgi://127.0.0.1:9001", host: "qa.project.com"

При этом Composer использовал нужную версию:

composer diagnose
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Checking pubkeys: FAIL
Missing pubkey for tags verification
Missing pubkey for dev verification
Run composer self-update --update-keys to set them up
Checking composer version: You are not running the latest stable version, run `composer self-update` to update (2.1.9 => 2.8.5)
Composer version: 2.1.9
PHP version: 7.2.34

Тогда я решил проверить, какие процессы с php-fpm запущены и обнаружил, что работает сразу три версии и предположил, что дело в этом:

ps aux | grep php-fpm
root        1658  0.0  0.1 412236 43280 ?        Ss   Feb18   0:05 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
www-data    1659  0.0  0.0 412676 11064 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1660  0.0  0.0 412676 11068 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1661  0.0  0.0 412676 11072 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1662  0.0  0.0 412676 11072 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1663  0.0  0.0 412676 11072 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1664  0.0  0.0 412676 11072 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1665  0.0  0.0 412676 11076 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1666  0.0  0.0 412676 11076 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1667  0.0  0.0 412676 11076 ?        S    Feb18   0:00 php-fpm: pool www
www-data    1668  0.0  0.0 412676 11076 ?        S    Feb18   0:00 php-fpm: pool www
root       70363  0.0  0.2 452480 75592 ?        Ss   Feb18   0:05 php-fpm: master process (/etc/php/7.1/fpm/php-fpm.conf)
root      738933  0.0  0.1 332168 43156 ?        Ss   13:59   0:00 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
www-data  746954  0.0  0.0 453128 22940 ?        S    14:13   0:00 php-fpm: pool www
www-data  746955  0.0  0.0 453128 20296 ?        S    14:13   0:00 php-fpm: pool www
www-data  746956  0.0  0.0 453128 20296 ?        S    14:13   0:00 php-fpm: pool www
www-data  746957  0.0  0.0 453128 20300 ?        S    14:13   0:00 php-fpm: pool www
www-data  746958  0.0  0.0 453128 20300 ?        S    14:13   0:00 php-fpm: pool www
www-data  746959  0.0  0.0 453128 20276 ?        S    14:13   0:00 php-fpm: pool www
www-data  746960  0.0  0.0 453128 20284 ?        S    14:13   0:00 php-fpm: pool www
www-data  746961  0.0  0.0 453128 20284 ?        S    14:13   0:00 php-fpm: pool www
www-data  746962  0.0  0.0 453128 20324 ?        S    14:13   0:00 php-fpm: pool www
www-data  746963  0.0  0.0 453128 20324 ?        S    14:13   0:00 php-fpm: pool www
www-data  754067  0.0  0.0 332652 15632 ?        S    14:30   0:00 php-fpm: pool www
www-data  754068  0.0  0.0 332652 15632 ?        S    14:30   0:00 php-fpm: pool www

Тогда я закрыл неактуальные версии:

sudo systemctl stop php7.1-fpm
sudo systemctl stop php5-fpm.service

Тут я допустил ошибку: нужно было добавить перед закрытием в /etc/php/7.2/fpm/pool.d/www.conf следующие строки, чтобы fpm слушал 9001 порт:

; listen = /run/php/php7.2-fpm.sock
listen = 127.0.0.1:9001

Затем я перезагрузил fpm и openresty, ошибки ушли.