PHPで既にモジュールを読み込んでるとエラーになる

最近、久しぶりにPHPでプログラミングをする機会が増えた。
少し凝ったことをしようと思うと様々な拡張モジュールを使うことがありますが、そのモジュールをインストールしてなかったり、読み込む設定し忘れたりすると、エラーが出て思ったように動きません。
しかし、今回のエラーは逆でした。

PHP Warning:のエラー内容

PHPを実行したところ、以下のように警告のエラーが出力されました。
※’curl’の部分は読み込んでいるモジュールによって異なります

PHP Warning: Module 'curl' already loaded in Unknown on line 0

パッと見るとPHPモジュールが不足しているのかと思って確認すると、正しくインストールも読み込む設定もされていました。
しかし、よく見ると「既に読み込まれている」的な内容でした。
念のため日本語に翻訳。

PHP Warning: モジュール ‘curl’ は 0 行目の Unknown で既にロードされています。

うん、よくわからんが何かそんな感じ。
既に読み込んだPHPモジュールをさらに読み込もうとしていると解釈。

【原因】PHPモジュールを複数読み込んでいる

まずは、どこで拡張モジュール複数読み込んでいるのか探してみます。
設定ファイルの格納場所をすぐに忘れるので一覧で表示します。

PHP拡張モジュールを確認する

以下のように書いたPHPファイルを用意して確認してもいいですが、

<?php
phpinfo(INFO_MODULES);
?>

わざわざファイルを作成してブラウザで表示するのは面倒なので、LinuxUbuntu)からPHPコマンドで設定ファイル(~.ini)の一覧を表示してみます。

# 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の配下に追加の設定がある様子。
エラーが出ているモジュール名の設定ファイルがあるのですぐに見つかりますね!

/etc/php/7.4/cli/conf.d配下にある設定ファイルは、リンクを張っているだけですので、実際には、/etc/php/7.4/mods-available/の配下に格納されています

【対策】拡張モジュールの確認と変更

それでは、設定ファイルの内容を確認して、本当にモジュールを複数読み込むように設定しているか確認して、変更していきましょう。
今回のエラーの内容から、確認するのは以下2つのファイルだけで良さそうです。

  1. /etc/php/7.4/cli/php.ini
  2. /etc/php/7.4/cli/conf.d/20-curl.ini

拡張モジュールの有効・無効を確認

個のファイルの「extension=~」がある行を探し出します。
ここでは「extension=curl(.so)」が書いてある行を探します。

php.ini
・・・
;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がズラ~っと書いてかる行が並んでいると思います。

20-curl.ini
; configuration for php curl module
; priority=20
extension=curl.so

20-curl.iniではすぐに見つかりましたね!

変更してエラーを解消!

行の先頭の「;セミコロン)」はコメントアウトを表します。
見てわかる通り、どちらのファイルでも同じモジュールを有効にしていましたので、どちらか一方をコメントアウトしたら解決です!

通常は拡張設定ファイル(20-curl.ini)の方で行うのですが、何故かphp.ini側でも有効化されていました。。

管理者

たぶん、昔変更したのを忘れていただけだと思います。

てなわけで、extension=curl;extension=curlに変更するだけで万事解決です!
後はサービスを再起動してあげましょう。
お疲れ様でした!

著:大重 美幸
¥3,344 (2022/12/04 17:09時点 | Amazon調べ)


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA