テックブログ

yum update でコンフリクトするパッケージを shell/swap で操作する方法【PHP8.0へアップデート】

updates

こんにちは、運用チームのtuouraと申します。

今日はyumコマンドの小ネタを紹介致します。

PHP7.3からPHP8.0へアップデート

PHP7.3のEOLが近づいてきました・・・という訳で、一足飛ばしにPHP8.0にバージョンアップを行おうと思います。

サーバOSはAmazonLinux2、導入済みのAmazonのExtras LibraryのPHP7.3からPHP8.0に切り替え、アップデートをかけてみます。

# php -v
PHP 7.3.29 (cli) (built: Jul  7 2021 17:34:15) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.29, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.29, Copyright (c) 1999-2018, by Zend Technologies
# amazon-linux-extras list|grep php
  _  php7.2                   available    \
  _  lamp-mariadb10.2-php7.2  available    \
 31  php7.3=latest            enabled      \
  _  php7.4                   available    [ =stable ]
  _  php8.0                   available    [ =stable ]


# amazon-linux-extras disable php7.3
# amazon-linux-extras enable php8.0
# amazon-linux-extras list|grep php
  _  php7.2                   available    \
  _  lamp-mariadb10.2-php7.2  available    \
  _  php7.3                   available    \
  _  php7.4                   available    [ =stable ]
 51  php8.0=latest            enabled      [ =stable ]
# yum update php*
~略
エラー: パッケージ: php-json-7.3.29-1.amzn2.x86_64 (@amzn2extra-php7.3)
             要求: php-common(x86-64) = 7.3.29-1.amzn2
            削除中: php-common-7.3.29-1.amzn2.x86_64 (@amzn2extra-php7.3)
                php-common(x86-64) = 7.3.29-1.amzn2
            次のものにより更新された: : php-common-8.0.8-1.amzn2.x86_64 (amzn2extra-php8.0)
                php-common(x86-64) = 8.0.8-1.amzn2
            利用可能: php-common-5.4.16-43.amzn2.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-43.amzn2
            利用可能: php-common-5.4.16-43.amzn2.0.1.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-43.amzn2.0.1
            利用可能: php-common-5.4.16-43.amzn2.0.2.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-43.amzn2.0.2
            利用可能: php-common-5.4.16-43.amzn2.0.3.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-43.amzn2.0.3
            利用可能: php-common-5.4.16-43.amzn2.0.4.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-43.amzn2.0.4
            利用可能: php-common-5.4.16-45.amzn2.0.5.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-45.amzn2.0.5
            利用可能: php-common-5.4.16-45.amzn2.0.6.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-45.amzn2.0.6
            利用可能: php-common-5.4.16-46.amzn2.0.2.x86_64 (amzn2-core)
                php-common(x86-64) = 5.4.16-46.amzn2.0.2
            利用可能: php-common-8.0.0-2.amzn2.x86_64 (amzn2extra-php8.0)
                php-common(x86-64) = 8.0.0-2.amzn2
            利用可能: php-common-8.0.2-1.amzn2.x86_64 (amzn2extra-php8.0)
                php-common(x86-64) = 8.0.2-1.amzn2
            利用可能: php-common-8.0.6-1.amzn2.x86_64 (amzn2extra-php8.0)
                php-common(x86-64) = 8.0.6-1.amzn2
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

見事(?)に失敗しました。

どうやらJSON拡張モジュールのパッケージ が原因でアップデートが出来ない様です。

PHP8.0.0以降にはJSON拡張モジュールのパッケージが無い

PHP8.0.0以降では、JSON拡張モジュールはデフォルトでコアに組み込まれており、対象パッケージが存在しないため、直接アップデートが出来なかった様です。

PHP > マニュアル > 関数リファレンス > その他の基本モジュール > JSON > インストール/設定

という事で、JSON拡張モジュールのパッケージだけ削除を試してみます。

# yum remove php-json
~略
==================================================================================================================================
 Package                      アーキテクチャー       バージョン                          リポジトリー                        容量
==================================================================================================================================
削除中:
 php-json                     x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                  83 k
依存性関連での削除をします:
 php                          x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 9.7 M
 php-cli                      x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                  15 M
 php-common                   x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                  12 M
 php-devel                    x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                  11 M
 php-fpm                      x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 4.9 M
 php-gd                       x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 749 k
 php-mbstring                 x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 2.0 M
 php-mysqlnd                  x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 824 k
 php-opcache                  x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 1.0 M
 php-pdo                      x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 373 k
 php-pear                     noarch                 1:1.10.12-9.amzn2                   @amzn2-core                        2.1 M
 php-process                  x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 182 k
 php-xml                      x86_64                 7.3.29-1.amzn2                      @amzn2extra-php7.3                 808 k

トランザクションの要約
==================================================================================================================================
削除  1 パッケージ (+13 個の依存関係のパッケージ)

このまま進めると、仲良く全てのPHPパッケージが綺麗になりますね。

完全にPHP7.3を削除した後に、改めてPHP8.0をインストールしても良いのですが、もう少しスマートな方法を考えてみます。

yum shell でJSON拡張モジュールだけ削除してアップデートする

依存関係でコンフリクトが発生しているパッケージが分かったので、yum shell の登場です。

yum shell 上でJSON拡張モジュールだけ削除し、アップデートをしてみます。

※「run」までが入力したコマンドです。

# yum shell
読み込んだプラグイン:langpacks, priorities, update-motd
> remove php-json
> update php php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml
run
~略
==================================================================================================================================
 Package                       アーキテクチャー        バージョン                       リポジトリー                         容量
==================================================================================================================================
更新します:
 php                           x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   3.3 M
 php-cli                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   5.0 M
 php-common                    x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   1.2 M
 php-devel                     x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   1.3 M
 php-fpm                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   1.7 M
 php-gd                        x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   168 k
 php-mbstring                  x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   473 k
 php-mysqlnd                   x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   189 k
 php-opcache                   x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   522 k
 php-pdo                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   122 k
 php-process                   x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                    82 k
 php-xml                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   173 k
削除中:
 php-json                      x86_64                  7.3.29-1.amzn2                   @amzn2extra-php7.3                   83 k

トランザクションの要約
==================================================================================================================================
更新  12 パッケージ
削除   1 パッケージ
~略
更新:
  php.x86_64 0:8.0.8-1.amzn2                 php-cli.x86_64 0:8.0.8-1.amzn2            php-common.x86_64 0:8.0.8-1.amzn2
  php-devel.x86_64 0:8.0.8-1.amzn2           php-fpm.x86_64 0:8.0.8-1.amzn2            php-gd.x86_64 0:8.0.8-1.amzn2
  php-mbstring.x86_64 0:8.0.8-1.amzn2        php-mysqlnd.x86_64 0:8.0.8-1.amzn2        php-opcache.x86_64 0:8.0.8-1.amzn2
  php-pdo.x86_64 0:8.0.8-1.amzn2             php-process.x86_64 0:8.0.8-1.amzn2        php-xml.x86_64 0:8.0.8-1.amzn2

完了しました!

上手く行きました!

JSON拡張も有効な様です。

# php -v
PHP 8.0.8 (cli) (built: Jul 7 2021 17:35:32) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.8, Copyright (c) Zend Technologies
with Zend OPcache v8.0.8, Copyright (c), by Zend Technologies
# php -i|grep json
json
json support =>  enabled

yum swap でJSON拡張モジュール だけ削除してアップデートする

更にスマートな方法がある様です。

yum マニュアルの swap の項目には、こう書かれています。

swap At it's simplest this is just a simpler way to remove one set of package(s) and install another set of pack‐
age(s) without having to use the "shell" command. However you can specify different commands to call than just
remove or install, and you can list multiple packages (it splits using the "--" marker). Note that option pars‐
ing will remove the first "--" in an argument list on the command line.

Examples:

swap foo bar
swap -- remove foo -- install bar
swap foo group install bar-grp
swap -- group remove foo-grp -- group install bar-grp

DeepLで解説部分を和訳してみます。

swap 簡単に言えば、「シェル」コマンドを使わずに、あるパッケージを削除して、別のパッケージをインストールする方法です。
パッケージをインストールする簡単な方法で、「shell」コマンドを使う必要はありません。しかし、単に remove や install 以外のコマンドを指定することもできます。
また、複数のパッケージを列挙することもできます(「--」で分割されます)。なお、オプションの解析
がコマンドラインの引数リストの最初の「--」を削除することに注意してください。

yum swap を使う事で、 yum shell を使わず、簡単にパッケージを入れ替えられるようですね。

JSON拡張パッケージを削除で指定し、他のパッケージはアップデートを指定してみます。

# yum swap -- remove php-json -- update php php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml
~略
==================================================================================================================================
 Package                       アーキテクチャー        バージョン                       リポジトリー                         容量
==================================================================================================================================
更新します:
 php                           x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   3.3 M
 php-cli                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   5.0 M
 php-common                    x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   1.2 M
 php-devel                     x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   1.3 M
 php-fpm                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   1.7 M
 php-gd                        x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   168 k
 php-mbstring                  x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   473 k
 php-mysqlnd                   x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   189 k
 php-opcache                   x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   522 k
 php-pdo                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   122 k
 php-process                   x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                    82 k
 php-xml                       x86_64                  8.0.8-1.amzn2                    amzn2extra-php8.0                   173 k
削除中:
 php-json                      x86_64                  7.3.29-1.amzn2                   @amzn2extra-php7.3                   83 k

トランザクションの要約
==================================================================================================================================
更新  12 パッケージ
削除   1 パッケージ

yum swap でも綺麗にバージョンアップが出来ました!

実際のバージョンアップの時には

yum shell / yum swap で、PHPのバージョンアップが非常に簡単に出来ました。

実際にバージョンアップを行う際は、コンテンツ側での改修や、他にパッケージの追加や更新も必要となる事もあるので、事前に動作検証を行い、慎重に行いましょう。

また、今回は利用しているPHPを直接バージョンアップしましたが、サーバの設定によっては、複数のPHPを同居し、切り替えを行う事も可能です。

PHPのバージョンアップの仕方が分からない、そもそもサーバでバージョンアップ出来るか分からない等、お困りの事があれば、ぜひフォームやフリーダイヤルから、お問い合わせください。

最後まで読んで頂き、有難うございました。

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください