Как обновить php до нужной версии и привести зависимости к нужной версии
- Не обязательно удалять нынешнюю версию Php, можно оставить несколько. Например, как в данном случае:
update-alternatives --list php
/usr/bin/php5
/usr/bin/php7.1
/usr/bin/php7.2
/usr/bin/php7.4
- Проверяем, какие зависимости установлены для текущей версии:
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
- Проверяем, какие версии нам доступны для обновления
apt-cache show php7.2
- Чтобы узнать, поддерживает ли наша версия Ubuntu/Debian нужный пакет, можно перейти сюда и убедиться, что тут есть нужный пакет
- Подключаем необходимые репозиторий для обновления, если нужной версии не нашлось
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
- На 3-ем шаге мы получили название пакета, который нам доступен. Копируем его и вставляем:
sudo apt install php7.2=7.2.34-54+0~20241224.101+debian12~1.gbpb6068e
- Затем устанавливаем идентичные зависимости, которые установлены для других версий, из 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
- Если на сервере установлено несколько версий 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
- После смены версии не забудь отрестартить сервисы:
sudo systemctl restart php7.2-fpm.service
sudo systemctl restart nginx
Если необходимо понизить версию модулей
Если в процессе деплоя у разработки ошибка вида:
необходимо понизить версию 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, ошибки ушли.