PHP7.4で「Uncaught Error: Class ‘ZipArchive’ not found」を対処した話

PHP7.4で「Uncaught Error: Class ‘ZipArchive’ not found」を対処した話

PHP7.2からPHP7.4へアップグレードした際、いままではつかえていたnew ZipArchive()を行うと、

「Uncaught Error: Class ‘ZipArchive’ not found」というエラーが発生するようになりました。

php-pecl-zipはインストール済み、/usr/lib64/zip.soも存在している状態でした。


エラー調査

パッケージのインストール確認

まず、ZipArchiveを使うためのライブラリがインストールされているかを確認

dnf list --installed php-pecl-zip

Installed Packages
php-pecl-zip.x86_64                                            1.18.2-1.module+el8.3.0+6678+b09f589e

インストールされているようです。

モジュールの存在確認

zip.soがphpのextensionとして読み込めるところにあるか確認します。

ll /usr/lib64/php/modules/zip.so
-rwxr-xr-x 1 root root 79760 May 19  2020 /usr/lib64/php/modules/zip.so

存在もしています。

phpで読み込まれているモジュール確認

モジュールが有効になっているか、一覧で確認します。

php -m | grep zip

すると、以下のようなWarningが表示されました。

PHP Warning:  PHP Startup: Unable to load dynamic library 'zip.so' (tried: /usr/lib64/php/modules/zip.so (/usr/lib64/php/modules/zip.so: undefined symbol: zip_register_cancel_callback_with_state), /usr/lib64/php/modules/zip.so.so (/usr/lib64/php/modules/zip.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

対処

PHPを7.4にアップグレードした際、php-pecl-zipが使用するlibzipが一緒にバージョンアップしないため、上記のエラーが出ている様でした。

libzipをアップグレードします。

dnf upgrade libzip