最近、久しぶりにPHPでプログラミングをする機会が増えた。
少し凝ったことをしようと思うと様々な拡張モジュールを使うことがありますが、そのモジュールをインストールしてなかったり、読み込む設定し忘れたりすると、エラーが出て思ったように動きません。
しかし、今回のエラーは逆でした。
PHP Warning:のエラー内容
PHPを実行したところ、以下のように警告のエラーが出力されました。
※’curl’の部分は読み込んでいるモジュールによって異なります
1 |
PHP Warning: Module 'curl' already loaded in Unknown on line 0 |
パッと見るとPHPモジュールが不足しているのかと思って確認すると、正しくインストールも読み込む設定もされていました。
しかし、よく見ると「既に読み込まれている」的な内容でした。
念のため日本語に翻訳。
PHP Warning: モジュール ‘curl’ は 0 行目の Unknown で既にロードされています。
うん、よくわからんが何かそんな感じ。
既に読み込んだPHPモジュールをさらに読み込もうとしていると解釈。
【原因】PHPモジュールを複数読み込んでいる
まずは、どこで拡張モジュールを複数読み込んでいるのか探してみます。
設定ファイルの格納場所をすぐに忘れるので一覧で表示します。
PHP拡張モジュールを確認する
以下のように書いたPHPファイルを用意して確認してもいいですが、
1 2 3 |
<?php phpinfo(INFO_MODULES); ?> |
わざわざファイルを作成してブラウザで表示するのは面倒なので、Linux(Ubuntu)からPHPコマンドで設定ファイル(~.ini
)の一覧を表示してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# php --ini PHP Warning: Module 'curl' already loaded in Unknown on line 0 Configuration File (php.ini) Path: /etc/php/7.4/cli Loaded Configuration File: /etc/php/7.4/cli/php.ini Scan for additional .ini files in: /etc/php/7.4/cli/conf.d Additional .ini files parsed: /etc/php/7.4/cli/conf.d/10-mysqlnd.ini, /etc/php/7.4/cli/conf.d/10-opcache.ini, /etc/php/7.4/cli/conf.d/10-pdo.ini, /etc/php/7.4/cli/conf.d/15-xml.ini, /etc/php/7.4/cli/conf.d/20-bcmath.ini, /etc/php/7.4/cli/conf.d/20-calendar.ini, /etc/php/7.4/cli/conf.d/20-ctype.ini, /etc/php/7.4/cli/conf.d/20-curl.ini, /etc/php/7.4/cli/conf.d/20-dom.ini, /etc/php/7.4/cli/conf.d/20-exif.ini, /etc/php/7.4/cli/conf.d/20-ffi.ini, /etc/php/7.4/cli/conf.d/20-fileinfo.ini, /etc/php/7.4/cli/conf.d/20-ftp.ini, /etc/php/7.4/cli/conf.d/20-gd.ini, /etc/php/7.4/cli/conf.d/20-gettext.ini, /etc/php/7.4/cli/conf.d/20-iconv.ini, /etc/php/7.4/cli/conf.d/20-json.ini, /etc/php/7.4/cli/conf.d/20-ldap.ini, /etc/php/7.4/cli/conf.d/20-mbstring.ini, /etc/php/7.4/cli/conf.d/20-mysqli.ini, /etc/php/7.4/cli/conf.d/20-pdo_mysql.ini, /etc/php/7.4/cli/conf.d/20-phar.ini, /etc/php/7.4/cli/conf.d/20-posix.ini, /etc/php/7.4/cli/conf.d/20-readline.ini, /etc/php/7.4/cli/conf.d/20-shmop.ini, /etc/php/7.4/cli/conf.d/20-simplexml.ini, /etc/php/7.4/cli/conf.d/20-sockets.ini, /etc/php/7.4/cli/conf.d/20-sysvmsg.ini, /etc/php/7.4/cli/conf.d/20-sysvsem.ini, /etc/php/7.4/cli/conf.d/20-sysvshm.ini, /etc/php/7.4/cli/conf.d/20-tokenizer.ini, /etc/php/7.4/cli/conf.d/20-xmlreader.ini, /etc/php/7.4/cli/conf.d/20-xmlwriter.ini, /etc/php/7.4/cli/conf.d/20-xsl.ini |
あれま。例のエラーと共に設定ファイルの一覧が表示されました。
どうやら、/etc/php/7.4/cli/php.ini
に標準の設定、/etc/php/7.4/cli/conf.d
の配下に追加の設定がある様子。
エラーが出ているモジュール名の設定ファイルがあるのですぐに見つかりますね!
【対策】拡張モジュールの確認と変更
それでは、設定ファイルの内容を確認して、本当にモジュールを複数読み込むように設定しているか確認して、変更していきましょう。
今回のエラーの内容から、確認するのは以下2つのファイルだけで良さそうです。
/etc/php/7.4/cli/php.ini
/etc/php/7.4/cli/conf.d/20-curl.ini
拡張モジュールの有効・無効を確認
個のファイルの「extension=~」がある行を探し出します。
ここでは「extension=curl(.so)」が書いてある行を探します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
・・・ ;extension=bz2 extension=curl ;extension=ffi ;extension=ftp ;extension=fileinfo ;extension=gd2 ;extension=gettext ;extension=gmp ;extension=intl ;extension=imap ;extension=ldap ;extension=mbstring ・・・ |
extension
がズラ~っと書いてかる行が並んでいると思います。
1 2 3 |
; configuration for php curl module ; priority=20 extension=curl.so |
20-curl.ini
ではすぐに見つかりましたね!
変更してエラーを解消!
行の先頭の「;(セミコロン)」はコメントアウトを表します。
見てわかる通り、どちらのファイルでも同じモジュールを有効にしていましたので、どちらか一方をコメントアウトしたら解決です!
通常は拡張設定ファイル(20-curl.ini
)の方で行うのですが、何故かphp.ini
側でも有効化されていました。。
たぶん、昔変更したのを忘れていただけだと思います。
てなわけで、extension=curl
を;extension=curl
に変更するだけで万事解決です!
後はサービスを再起動してあげましょう。
お疲れ様でした!
コメント