質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1324閲覧

PHP のバージョンアップ後、CURLのモジュールの読み込みに失敗してしまっているので 解決したい

saya24

総合スコア256

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2024/07/17 11:13

編集2024/07/19 05:07

実現したいこと

PHPを8.1 から 8.3へ ヴァージョンアップしたのですが、それ以降あるWebAPIへの接続に失敗するようになってしまいました。
達成したい課題は CURLのモジュールの正常な読み込みです。

発生している問題・分からないこと

PHPのログを確認したら、CURLのモジュールの読み込みに失敗していることが判明し、試しにPHPINFOを表示させたところ、案の定 CURLのモジュールが現れていない状況でした。(関係性よくわかっていないですがOpenSSLのモジュールも表示されていないことを確認)
イメージ説明
イメージ説明イメージ説明

エラーメッセージ

error

1[17-Jul-2024 10:34:42 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: ext\curl (指定されたモジュールが見つかりません。), ext\php_curl.dll (指定されたプロシージャが見つかりません。)) in Unknown on line 0 2[17-Jul-2024 10:34:44 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: ext\curl (指定されたモジュールが見つかりません。), ext\php_curl.dll (指定されたプロシージャが見つかりません。)) in Unknown on line 0

該当のソースコード

php.ini

1extension=curl

httpd.conf

1LoadFile "C:/PHP/libssh2.dll" 2LoadFile "C:/PHP/libcrypto-3-x64.dll" 3LoadFile "C:/PHP/libssl-3-x64.dll"

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Qiitaのある記事 に掲載されたコマンドを以下の通り実行して、全てにOKの返答を受けました。
イメージ説明イメージ説明
また、記事にあるとおり、上記のごとく Apache24の httpd.conf へ追記を果たしていますが、それでも状況に進展はありませんでした。
言うまでもなく、Apacheのサービス再起動後の確認を徹底しています。 

一体 私は あと何を確認すればよいのでしょうか

補足

特になし

20240719 09:24AM追記
イメージ説明

2024/07/19 14:06PM追記
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/07/17 12:19

> Unable to load dynamic library 'curl' (tried: ext\curl (指定されたモジュールが見つかりません。) このメッセージは、 extension=curl としているためで、正しくは、 extension=php_curl.dll と記述します。ですが、続いて以下のメッセージが表示されていますので、デフォルトの ext\php_curl.dll を検索しています。 > , ext\php_curl.dll (指定されたプロシージャが見つかりません。)) in Unknown on line 0 そして、「指定されたプロシージャが見つかりません。」というエラーが発生しているので、おそらく、依存関係にある dll(libeay32.dll と ssleay32.dll)がロードできないでいるのではないかと思います。(所定の位置にインストールされていないのかもしれません)
tezcello

2024/07/17 14:57

> extension=curl > としているためで、正しくは、 > extension=php_curl.dll > と記述します それは古い記述の仕方なのでは? https://www.php.net/manual/ja/install.pecl.windows.php には ; PHP バージョン 7.2 以降では、下記が良いでしょう。 extension=extname とあります。 > PHPを8.1 から 8.3へ ヴァージョンアップした どの様にしてバージョンアップしたのかにヒントがあるかもしれません。 コマンドラインで($ php -i )ではOKで、ウェブサーバ経由(phpinfo())でダメという事は、ウェブサーバの設定を疑っても良いかもしれません。 いろいろ検索してみると、 ・Apacheのバージョンが古いとダメ ・結局Apacheの bin/ にファイルをコピーしたらOKだった なんてのが見つかりましたが、バックデータまで辿り着けなかったので真偽の程が... 因みに、手元のXAMPPを見てみると、一連の .confには "LoadFile"は、以下の3つだけ(パスは一部省略) httpd-xampp.conf:LoadFile "/xampp/php/php8ts.dll" httpd-xampp.conf:LoadFile "/xampp/php/libpq.dll" httpd-xampp.conf:LoadFile "/xampp/php/libsqlite3.dll" それは、パスの通っているところに置いているからなのだと予想します。 __だから .dll をコピーしたら...って事になったのかも そして、以下のファイルが存在しました。 /xampp/apache/bin/libssh2.dll /xampp/apache/bin/libcrypto-1_1-x64.dll /xampp/apache/bin/libssl-1_1-x64.dll /xampp/php/libssh2.dll (これはファイルサイズから bin/libssh2.dll と同じみたい) /xampp/php/libcrypto-3-x64.dll /xampp/php/libssl-3-x64.dll http.conf で指定すべきファイルを間違えているという事はありませんか? __http.confで指定すべきは libcrypto-1_1-x64.dll 等だったかも 先の方が指摘されていますが、公式マニュアル https://www.php.net/manual/ja/curl.installation.php から、OpenSSL 1.1 以降で必要なのは、libcrypto-*.dll、libssl-*.dll、libssh2.dllで、 libeay32.dll と ssleay32.dll は不要みたいです。 __手元のXAMPPにも *eay32.dll は存在しないみたい
saya24

2024/07/18 01:23

御二方 ご見解をありがとうございます。 PHPのVerUp方法は 特段何かのインストーラをつかったことは なく PHP運用中の稼働サーバと同じ Apache2.4を 別PCに導入し PHP.iniを含む PHPフォルダを仕上げて そのフォルダまるまるを サーバ上に配置した感じです。 =サーバ上のかつてのPHPフォルダを リネームして、PC側で仕上げたPHPフォルダをCドライブに配置 PC側でも CURLとOPENSSLのモジュールが PHPINFOに現れていなかったことを サーバに移行してから気が付きました。 尚、また事前の検証PCでの作業に戻りまして、以下3つのdllファイルを ApacheのBINフォルダに配置して、様子をみたのですが 状況に進展なし=PHPINFOにCURLとOPENSSLのモジュールは確認できませんでした。 C:/PHP/libssh2.dll C:/PHP/libcrypto-3-x64.dll C:/PHP/libssl-3-x64.dll いやぁ 本当に困ったなぁ
tezcello

2024/07/18 01:40

> dllファイルを ApacheのBINフォルダに配置 当然、LoadFileの行は削除しましたよね? > C:/PHP/libcrypto-3-x64.dll > C:/PHP/libssl-3-x64.dll その二つは本当にApacheに必要なファイルですか? 問題なく動作している手元のXAMPPでは、 /xampp/apache/bin/libcrypto-1_1-x64.dll /xampp/apache/bin/libssl-1_1-x64.dll がApacheに供されている様子で、PHPが利用していると思われる /xampp/php/libcrypto-3-x64.dll /xampp/php/libssl-3-x64.dll とは別物(ファイルサイズが違う)でした。 PHPで使っているのと同じモノをApacheでも使うのは、何かのエビデンスがありますか? ファイル名が違うのはバージョン等が違うからでしょうし、Apacheが期待しているモノはPHPが期待しているモノとは違うのではありませんか?
yambejp

2024/07/18 03:41

XAMPPのPHPでさえ現状8.2系ですね。8.3を利用したい理由はなにかあるのでしょうか? 枯れていないバージョンを利用する場合はリスクを自力で解決するだけのスキルと根性が必要です
saya24

2024/07/19 00:23

8.3.9を選択した理由は 昨今リリースされた中で、一番息が長いから という安易な理由でした。(すみません) 本件に関わる現況を共有させて頂きます。 本文で言及した Qiitaの記事を参考に対処した作業は なかったように致しました。 1. httpd.confに行った 3点のLoadFile記述は 除去。 2. Apache24\bin フォルダにPHPフォルダ側から複写配置した 上記言及の3点dllファイルも削除。 (尚、上記対応後も、deplister.exe ext\php_curl.dll のコマンド実行で 全てOKの表示を確認) また、OPENSSLとの関係を相変わらずよく 理解できていないのですが、php.ini内で extension=openssl が コメントアウトになっていたので、コメントを除去致しました。 以前の運用Verの PHP8.1 際のphp.iniでは こちら コメントアウトのようでしたから コメントアウトでのCURL確立が 正しいのでしょうが 尚、この作業をうけて 表示されるようになった OPENSSL部分を 本文に画像貼り付け致しました(相変わらずCURL部分は表示されていない)。 こちらに表示されている OpenSSL Default Config の定義パスが 実在しない点が 若干気になるところです。 
tezcello

2024/07/19 04:45

> extension=openssl が コメントアウトになっていた これは openssl系の関数を使う為の設定では? https://www.php.net/manual/ja/book.openssl.php > こちらに表示されている OpenSSL Default Config の定義パスが 実在しない 上記マニュアルの「インストール手順」で言及されています。 > 相変わらずCURL部分は表示されていない コマンドラインで、php -i を実行した場合はどうなるのでしょうか? __php -m では curl が存在するとの事でしたが > PHPのVerUp方法は 特段何かのインストーラをつかったことは なく > PHP運用中の稼働サーバと同じ Apache2.4を 別PCに導入し > PHP.iniを含む PHPフォルダを仕上げて そのフォルダまるまるを サーバ上に配置した 「PHPフォルダを仕上げて」が「 PHP8.3 をどこぞから持って来た(=バージョンアップした)」を意味するのでしょうか? まさか、php.exeだけをコピーしてきたとは思いませんが、その「仕上げて」にヒントがありませんか? PCとサーバが入り乱れていますが、サーバとは Windows Server の事でしょうか? __古い Windows Server のアレコレは、新しい Windows では動作しないかも ウェブサーバやPHPを個別にインストールする場合、テキトーにやるとスレッドセーフだったり、コンパイラの違いだったりで、動いている様なフリをする事がある様に思います。 インストーラを使わないなら、要求するライブラリやそのバージョンを見落とさない様にしなければいけませんが大丈夫ですよね? __ある時からライブラリが変わるなんてのは良くある
saya24

2024/07/19 05:56 編集

お時間いただき ありがとございます。 PHP.exeだけを PCから移行するようなことは行っていません。 PHPのサイトからダウンロードしてきた圧縮ファイルphp-8.3.9-Win32-vs16-x64.zipiを 検証用のWindows10端末の上で 展開して、それをPHPフォルダとしてリネーム&配置、こちらの中のiniを編集したり、Apache24のhttpd.confの編集を行い、WebページでPHPINFOを表示できることや データベースからのデータ参照を確立しました。 とりあえず 本文に php -i を実行した結果の画像(curl部分)を張り付けさせて頂きました。 ちなみに今回のヴァージョンのPHPのフォルダに、 libcrypto-1_1-x64.dll  と   libssl-1_1-x64.dll は存在しておりませんでした。 Apache24のbinフォルダには 存在しており、Qiitaの記事もあったように、後継バージョンのdllを配置した方がよいのかな、との思いで binフォルダへの配置や httpd.cofへ 以下記述を試行してみた感じでした。(結果思わしくなく 今は元に戻しましたが) LoadFile "C:/PHP/libssh2.dll" LoadFile "C:/PHP/libcrypto-3-x64.dll" LoadFile "C:/PHP/libssl-3-x64.dll"
tezcello

2024/07/19 06:16

コマンドラインではOKとの事なので、モジュールとして使う(Apacheだからきっとそうですよね?)時に何か引っ掛かっているみたいですね。 再度検索してみると、真偽が不明ですが以下が目に付きました。 ・(この状態=初期状態で)libssh2.dll を apache/bin にコピーする ・コマンドラインとウェブサーバ経由では参照する .ini が違う ・extension_dir は Apache経由の場合フルパスが必要 3番目は公式マニュアルにも「絶対パス推奨」となっているので、多少は信用できそうです。 https://www.php.net/manual/ja/ini.core.php#ini.extension-dir
saya24

2024/07/19 09:51

tezcelloさん ご見解をありがとうございました。 ご提案頂きました内容について、1つ目と3つ目を個別に試した結果をお知らせします、 1つ目、PHPフォルダにあったlibssh2.dllのみを Apache24\binに配置して、Apacheサービス再起動 ===>PHPINFOのWebページに 相変わらず curl のモジュール現れず 3つ目、PHPフォルダ内php.iniの extension_dirを編集、="ext" から="C:\php\ext" ===>PHPINFOのWebページに 相変わらず curl のモジュール現れず ご提案2つ目に関して、何か具体的に試行する操作があれば ご提示頂ければ幸いです。 7.4 ===> 8.1 のPHPのVerUpの際は こんな大変じゃ無かった印象だけに ショック!!! 
tezcello

2024/07/19 10:46

3つ目の php.ini 編集後、再起動はしていますよね? __1つ目しか「再起動」の文言がないので念の為 > ご提案2つ目に関して、何か具体的に試行する操作 コマンドライン、ウェブサーバ経由、共に参照している .ini ファイルをキチンと比較する事と、意図的に通常とは違う設定(例えば、タイムゾーンとかの通常動作に影響の無いモノを変えておく)をして、それが反映されているかを確認するのは如何? __ファイルが多くても一つ一つやってみるのをお勧めします また、ウェブサーバ経由の場合に不都合が起きるのだから、Apacheのログレベルを debug にまで下げて(上げて?)詳細なログが出る様にしてみては? __「期待したモノが無い」ってのが挙がってくるかも...
saya24

2024/07/19 11:30

再起動は都度変化が生じるたびに行っています。 当方は大したノウハウもない人間ななですが、仰られているiniファイルはPHP.iniのことでしょうか? またこれがWeb阪とコンソール阪がありえるとのことでしたら、PHPフォルダ以外にどちらにございますか? それともPHP.ini以外の何かをさされておりますでしょうか?? ご教示頂けたら幸いです。
tezcello

2024/07/19 11:39

ウェブサーバ経由で表示した phpinfo()の結果に、どの .ini を読み込んだか現れるはずです。 コマンドラインで php -i した場合も同様です。 __Configuration File (php.ini) Path ~ Additional .ini files parsed の辺り > それともPHP.ini以外の何か スキャンするディレクトリを指定しておくと、その下の .ini は全部読み込まれます。
saya24

2024/07/22 02:54

tezelloさん 遅くなりましたが Webページの確認とコマンドラインの確認での 結果報告となります。 Webページ(phpinfo): Loaded Configuration File C:\PHP\php.ini コマンドライン(php -i): Configuration File (php.ini) Path => Loaded Configuration File => C:\PHP\php.ini この状況は 特段問題がない状況でしょうかねぇ なお、Apacheの ログレベルをdebugに変えたところで、Apacheのエラーログに特段の記述なしでした。 Stack OverFlowみても 新しい記事みあたらないし、困ったなぁ
tezcello

2024/07/22 03:18

タイムゾーンの変更も提案しましたが、そちらは如何でしたか? 指定したモノがキチンと反映されているかの確認です。
saya24

2024/07/22 03:46

tezcelloさん 失礼致しました。仰られている確認は 以下でよろしかったでしょうか?? php.ini 内の date.timezone=Asia/Tokyo から date.timezone="Europe/Berlin" へ変更し 先程同様に Webページとコンソールで 確認。 結果は 同じtimezoneを表示していることを確認できました。
tezcello

2024/07/22 03:52

ではどちらも読み込まれているという事ですね。 ご確認いただきました phpinfo()と php -i の両方で、Additional .ini files parsed の項はどうなっていますか? 両者が一致しているか、それぞれのファイル内容にcurl関連の記述が無いかをお調べください。
saya24

2024/07/22 04:13

Webページでも、コンソールのphp-iにでも、(none)と 表示されています。 >それぞれのファイル内容にcurl関連の記述が無いかをお調べください。 もしこちらにパスらしきものが 表示されていれば 確認するということでよいんですよね??
tezcello

2024/07/22 04:44

大きな意味は無いのですが、チョッとだけ... コマンドラインで(もちろんPHPが見えるところ、あるいはパスの通っている所で) php -r "var_dump(curl_init('http://www.example.com/'));" とすれば、 class CurlHandle#1 (0) { } 的なモノが返ってきますよね? で、ウェブサーバ経由の場合も同様に実行するとエラーになると。 test.php <?php var_dump(curl_init("http://www.example.com/"));
saya24

2024/07/22 04:58

test.phpを作ってブラウザで表示を試行して、php_error_logに 出力された結果は以下。 [22-Jul-2024 04:52:33 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: ext\curl (指定されたモジュールが見つかりません。), ext\php_curl.dll (指定されたプロシージャが見つかりません。)) in Unknown on line 0 [22-Jul-2024 04:52:34 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'curl' (tried: ext\curl (指定されたモジュールが見つかりません。), ext\php_curl.dll (指定されたプロシージャが見つかりません。)) in Unknown on line 0 [22-Jul-2024 06:52:44 Europe/Berlin] PHP Fatal error: Uncaught Error: Call to undefined function curl_init() in C:\Apache24\htdocs\test.php:2 コンソールで、お示しのphp -r を実行した結果は 以下がプロンプト後に戻りました。 object(CurlHandle)#1 (0) { }
tezcello

2024/07/22 05:47

元に戻ってしまいましたね... やはりウェブサーバ経由の場合に問題があって、使えなくなっているという事でしょうね。 Apacheから見ているPHPが同じモノであるかを確認する為に、httpd.conf等を調べてください。 LoadModule で読み込んでいるのが同じファイルであるかや、関連付け、iniの場所など https://www.php.net/manual/ja/install.windows.apache2.php#install.windows.apache2.module 設定次第だと思いましたけど、Apacheの読み込む .confは複数ありませんか? PHPの設定は .confで変更(上書き)出来たので、PHP及び関連するファイルについてのナニカが無い事もご確認ください。 環境変数の PATHが、期待している PHPの存在するディレクトリを指しているかも、ご確認を。 __何やらリネームしたり等しているみたいだし...
saya24

2024/07/26 03:16

現在までPHP VerUpの検証は WebServer:Apache は 予めセットアップされていた端末を活用する手段をとっておりましたが 別のWindows10端末を先程入手できたので、Apacheを最新のものを取得し これも含めたセットアップ・確認する手立てに方向転換したいと思います。 ご報告まで
tezcello

2024/07/26 05:52

勝手な印象ですが、サーバ側でのアレコレを考えてみると... 現行のウェブサーバのコンパイラのコンパチビリティ(を含むnts/tsやバージョン、32/64bit等の違い)や、httpd.confの設定漏れ(過剰設定?)や書式の違い(新しい版に古い .conf)、別途インストールした事によるパスの記述違い(変更漏れ)、環境変数PATHと現実の乖離、実行環境(PHP)が複数存在する事による勘違い(パスの取っているところにあるのは古いPHP)とか、(古い)Apacheが期待しているライブラリは、最新のではなく古いモノだったり...
saya24

2024/07/27 07:49

Apache2.4.62を 新たな検証PCにセットアップして、そのうえで PHP 8.3.9 を新たに展開(取得していた圧縮ファイルを展開して、一からiniファイルを編集)して セットアップを進めたら 無事 PHPINFOに curlのモジュールが現れるようになりました。 よかったぁ~
tezcello

2024/07/27 13:39

解決した様で良かったです。お疲れさまでした。 違う点があるとしたら、Apacheの素性(バージョンその他と関連ファイルなど)がハッキリしている事くらいかなぁ? この問題は結構たくさんの情報が検索に引っ掛かるけど、今回はどれもマッチしなかったので、『ヒマがあれば』Apache側の利用するファイルを徹底検証しておくと、助かる人が居るかもしれないし、質問者さんの次のアップデートの際の目安になるかもしれません... ホントにお疲れさまでした。
guest

回答1

0

自己解決

PHP のみのバージョンアップということで、運用済みのWebServer:Apache2.4は 当初そのまま引き継ぐ予定でいましたが、解決の兆しが見えなく 相性・汚れた環境を疑いだして、結局こちらも最新版(2.4.62)を入手して ゼロベースで セットアップを進めることにしました。

すると 無事 curlのモジュールを PHPINFOのWebページに表すことができました。

お付き合い頂いた皆さま ご支援ありがとうございました。

投稿2024/07/28 00:01

saya24

総合スコア256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問