CentOS8+PHP7.4にZipArchiveをインストールする→`PHP Startup: Unable to load dynamic library ‘zip.so’`の警告に対処

基本的にはこの手順でCentOS8をインストール。ただしマシンのせいなのかインストールタイプを選ぶ画面が出ず、デスクトップ画面付きのPCとしての構成でインストールされた模様(インストール完了後、デスクトップUIが表示されたため)。

ちなみにPHPは7.4.4になりました。

このマシンで、10.のMySQL以外を設定した状態まで持って行きました。その後にZipArchiveを設定した際の話となります。

現象

普通に

# dnf list available | grep zip

# dnf install -y php74-php-pecl-zip.x86_64

でインストールを実行しました。

# vi /etc/php.ini


;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename
;
; For example:
;
;   extension=mysqli
;
; When the extension library to load is not located in the default extension
; directory, You may specify an absolute path to the library file:
;
;   extension=/path/to/extension/mysqli.so
;
; Note : The syntax used in previous PHP versions ('extension=<ext>.so' and
; 'extension='php_<ext>.dll') is supported for legacy reasons and may be
; deprecated in a future PHP major version. So, when it is possible, please
; move to the new ('extension=<ext>) syntax.
extension=zip.so

php.iniに追記。その後に

# systemctl restart httpd

でApacheを再起動しましたが……。

# less /var/log/php/php_errors.log

PHP Warning:  PHP Startup: Unable to load dynamic library 'zip.so' (tried: /usr/lib64/php/modules/zip.so (/usr/lib64/php/modules/zip.so: cannot open shared object file: No such file or directory), /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

Apache起動時にエラーが出てしましました。ライブラリが見付からないようです。

おかしいな、と思い

# ls /usr/lib64/php/modules/

を実行。すると、zip.soが一覧にありません。

なん……だと……。

# find / -name "*zip.so"
/opt/remi/php74/root/usr/lib64/php/modules/zip.so

あれ、モジュールの場所が違いますね。とりあえずシンボリックリンクを張ってみることにしました。

# ln -s /opt/remi/php74/root/usr/lib64/php/modules/zip.so /usr/lib64/php/modules/zip.so

# ls -al /usr/lib64/php/modules/

lrwxrwxrwx 1 root root      49 mm月 dd hh:ii zip.so -> /opt/remi/php74/root/usr/lib64/php/modules/zip.so

OK。この状態で再びApache再起動。

# systemctl restart httpd

すると、起動時にモジュールが見付からないエラーが表示されなくなりました。

動作検証はしていないのですが、おそらくこれで大丈夫ではないかと。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。