(Windows) PHP のコマンドを実行すると PHP Warning: PHP Startup: Unable to load dynamic library の警告が表示される

経緯

Windows でお手軽に PHP (というよりLAMP環境)を試す環境として、 XAMPP から Laragon の乗り換えを行いました。

その上であるリポジトリのパッケージガーデニングをして Composer でインストールしようとしたところ、 PHP のバージョンが要件を満たしていない、と怒られてしまいました。

ああ、そういえば XAMPP の PHP に環境変数(パス)が通ったままだった……と思って XAMPP の PHP を環境変数 Path から削除し、気を取り直して php -v したところ、意図しない警告が表示されました。

> php -v
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_curl.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_curl.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_gd2.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_gd2.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_mbstring.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_mbstring.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_mysqli.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_mysqli.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_openssl.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_openssl.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_pdo_mysql.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_pdo_mysql.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_xsl.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'C:/laragon/bin/php/php-X.X.X-nts-Win32-VC00-x86/ext\php_xsl.dll' - 指定されたモジュールが見つかりません。
 in Unknown on line 0
PHP X.X.X (cli) (built: MMM dd yyyy hh:ii:ss)
Copyright (c) yyyy The PHP Group
Zend Engine vZ.Z.Z, Copyright (c) yyyy Zend Technologies

……何故か存在しないパスの PHP (そもそも C:/laragon のパスに Laragon をインストールしていない) に対して、パッケージがないと警告してきました。

しかもバージョンも Laragon には 8.3系 で入れているはずなのに全く異なるバージョン番号でした。

Laragon の管理画面で右クリック→コンテキストメニューから「ツール」→「Path 環境変数」→「Path に Laragon を追加」で Laragon 関係の環境変数を一通り通して PC 自体の再起動をしても現象は変わりませんでした。

身に覚えのないバージョンの PHP 、そしてインストールパス。環境変数にも追加したはずなのに一向に意図したバージョンの PHP の情報が表示されないという事象。

これは一体どういうことなのか……と一瞬途方に暮れましたが、 何とか原因を突き止めました。

結論

先に結論を述べると、「別の開発用途で入れた Chocolatey に同梱されている PHP を参照していた」というのが今回の根本的な原因でした。

加えて、環境変数もシステム環境変数に Chocolatey のパスが通っており、ユーザ環境変数に追加した Laragon のパスよりもそちらが優先されていたために一向に意図したバージョンの PHP が表示されなかった、というオチでした。

調査

まずは事象の内容から環境変数のパスが正しく通っていないだろうと推測して、上述の通り Laragon 関係の環境変数を一気に追加しました。

が、結果は変わらず。

環境変数 Path の内容を見ると、今追加した Path はユーザ環境変数に追加されていることは確認でき、パスの一覧を検索しましたが PHP を含むパスは Laragon のみ。

どこに意図しないバージョンの PHP がいるのか皆目見当もつかなかったところ、

こちらの記事を参考に PowerShell から where.exe を実行。

> where.exe php
D:\laragon\laragon\bin\php\php-8.3.13-nts-Win32-vs16-x64\php.exe
C:\ProgramData\chocolatey\bin\php.exe

すると、 Laragon 以外にもう一つ…… Chocolatey に同梱された PHP がいることを突き止めました。

試しにシステム環境変数 Path を見てみると、

C:\ProgramData\chocolatey\bin

C:\ProgramData\chocolatey\bin\php.exe への足がかりになる、 C:\ProgramData\chocolatey\bin へのパスが通っていました。

そこで、システム環境変数の Path に D:\laragon\laragon\bin\php\php-8.3.13-nts-Win32-vs16-x64 を追記し、「上へ」で移動して C:\ProgramData\chocolatey\bin よりも上に持って行きました。

これで優先順位的には Laragon の方が先に探索されるので引っかかるはず……ということで、再度 php -v

> php -v
PHP 8.3.13 (cli) (built: Oct 22 2024 21:07:34) (NTS Visual C++ 2019 x64)
Copyright (c) The PHP Group
Zend Engine v4.3.13, Copyright (c) Zend Technologies

漸く意図した PHP のバージョンが表示されました。…… PHP のバージョンを切り替えるだけのつもりが、思ったよりも嵌まってしまいました。

参考

Laragon でのパス設定

PHP の所在確認

参考

Warning: PHP Startup: Unable to load dynamic library

この記事を書いた人

アルム=バンド

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