PHP Fatal error: Uncaught Error: Call to undefined function curl_init()
「上記のようなエラーが出てしまう・・・」
「PHPからcURL関数を利用したい」
このような場合には、この記事が参考となります。
この記事では、PHPでcURL関数を使えるための方法を解説しています。
本記事の内容
- curl_init()でエラーが出る原因
- PHP cURL拡張モジュール(php-curl)のインストール
- PHP cURL拡張モジュールの有効化
- cURL関数の動作確認
それでは、上記に沿って解説していきます。
curl_init()でエラーが出る原因
curl_init()のエラーが出るとは、PHPでcURL関数が使えないということです。
PHPでcURL関数が使えない原因は、大きく3つあります。
- cURLがインストールされていない
- PHP cURL拡張モジュールがインストールされていない
- PHP cURL拡張モジュールが有効化されていない
それぞれを下記で説明します。
cURLがインストールされていない
OSがLinuxであれば、通常cURLはインストールされています。
まずは、以下のコマンドで確認してみましょう。
$ curl --version curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.9 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.3.0) libssh/0.9.3/openssl/zlib nghttp2/1.41.0 librtmp/2.3 Release-Date: 2020-01-08 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
このようにcurlコマンドが利用可能のはずです。
Windowsの場合は、cURLをインストールする必要があるでしょう。
curlコマンドが動くことが確認できたら、次の原因を探ります。
PHP cURL拡張モジュールがインストールされていない
大抵の場合は、cURL拡張モジュールの未インストールが原因です。
インストールの有無は、次の方法で確認できます。
$ ls /usr/lib/php/20190902 | grep curl
cURL拡張モジュールが存在していれば、ここにモノ(共有ライブラリ)が存在しています。
あとは、パッケージのインストール状況を確認する方法があります。
$ apt list php-curl 一覧表示... 完了 php-curl/groovy,groovy,now 2:7.4+76 all
パッケージ管理システムでは、該当パッケージの認識はされています。
しかし、まだインストール済みではありません。
インストール済みなら、[インストール済み]と記載されるようになります。
PHP cURL拡張モジュールが有効化されていない
インストールしただけでは、cURL関数は使えません。
PHP cURL拡張モジュールを有効化して初めて、cURL関数が利用できます。
PHP cURL拡張モジュールの状況は、以下の方法で確認できます。
- 「php -m」でロードされているモジュール一覧を確認する
- 「phpinfo()」で出力される情報から確認する
それぞれの方法を載せておきます。
「php -m」でロードされているモジュール一覧を確認する
一覧から、grepで探します。
$ php -m | grep 'curl'
PHP cURL拡張モジュールが有効化されていれば、「curl」と表示されます。
「phpinfo()」で出力される情報から確認する
phpinfo()の結果をブラウザで見る方法が、一般的かもしれません。
でも、コマンドでやる場合は以下を実行します。
$ php -r 'phpinfo();' | grep 'cURL'
「curl」ではなく、「cURL」がポイントです。
有効化されていれば、何かしら表示されます。
まとめ
cURLがインストールされていることは、前提とします。
それ以外の2つに関しては、以下で対応方法を説明していきます。
PHP cURL拡張モジュール(php-curl)のインストール
インストールするパッケージを確認します。
パッケージ名は、「php-curl」となります。
$ sudo apt show php-curl Package: php-curl Version: 2:7.4+76 Priority: optional Section: php Source: php-defaults (76) Origin: Ubuntu Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Original-Maintainer: Debian PHP Maintainers <team+pkg-php@tracker.debian.org> Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 13.3 kB Depends: php-common, php7.4-curl Download-Size: 2,004 B APT-Sources: http://archive.ubuntu.com/ubuntu groovy/main amd64 Packages Description: CURL module for PHP [default] This package provides a CURL module for PHP. . PHP (PHP: Hypertext Preprocessor の再帰的頭字語) は広く使われている オープンソースな汎用スクリプト言語で、特にウェブ開発に適しており、 HTML に組み込むことができます。 . This package is a dependency package, which depends on Debian's default PHP version (currently 7.4).
パッケージのバージョンは、PHPのバージョンによって変わってきます。
そのため、バージョンは指定せずに「php-curl」とします。
php-curlのインストールは、以下のコマンドで行います。
$ sudo apt-get install php-curl
インストールはすぐに終わります。
まずは、パッケージの状況から確認します。
$ apt list php-curl 一覧表示... 完了 php-curl/groovy,groovy,now 2:7.4+76 all [インストール済み]
[インストール済み]が、記載されるようになりました。
では、モノ(共有ライブラリ)を確認しておきます。
$ ls /usr/lib/php/20190902 | grep 'curl' curl.so
PHP cURL拡張モジュール(php-curl)のインストールは、これで完了です。
PHP cURL拡張モジュールの有効化
通常なら、php.iniに以下の記述を追加します。
extension=curl.so
しかし、今回はその必要がありません。
「/etc/php/7.4/apache2/conf.d」の下に、「/etc/php/7.4/apache2/conf.d/20-curl.ini」が存在しています。
「/etc/php/7.4/apache2/conf.d/20-curl.ini」の内容は、以下。
$ cat /etc/php/7.4/apache2/conf.d/20-curl.ini ; configuration for php curl module ; priority=20 extension=curl.so
ここまで「php-curl」のインストールで実施されています。
昔はこんなに簡単ではなかったのですけどね。
設定を反映するために、Apacheの再起動を行います。
$ sudo systemctl restart apache2
再起動が完了したら、モジュールの状況を確認しましょう。
$ php -m | grep 'curl' curl
出てくるようになりました。
また、phpinfo()を使った確認も行っておきます。
$ php -r 'phpinfo();' | grep 'cURL' cURL support => enabled cURL Information => 7.68.0
もう十分ですが、ブラウザでもphpinfo()の結果を確認します。
これで、PHP cURL拡張モジュールの有効化までできました。
あとは、実際にcURL関数が使えるかどうか確認します。
cURL関数の動作確認
動作確認は、次のコードで行います。
<?php $url = "https://example.com/"; // curlセッション初期化 $ch = curl_init(); // curlオプション設定 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl実行 $res = curl_exec($ch); // curlセッション終了 curl_close($ch); // 結果確認 // echo $res; ?>
まず、上記コードを実行して、次のエラーが出なければOKです。
PHP Fatal error: Uncaught Error: Call to undefined function curl_init()
ただ、このままだとcURL関数が機能しているのかわかりづらいです。
その場合は、次のコードのコメントを外してください。
// echo $res;
ブラウザでアクセスした場合は、次の画面が表示されます。
コマンドラインで実行した場合は、以下のように表示されます。
$ php curl_test.php <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> ・・・
つまり、htmlソースがそのまま表示されているということです。
アクセスしたページの情報を丸ごと取得しています。
一般的には、jsonデータがアクセス先の情報となります。
そのため、丸ごと取得しても困った自体にはなりません。
この辺の細かいことは、オプションで自由に設定可能です。
cURL関数には、たくさんのオプションが用意されています。
以上、cURL関数の動作確認を説明しました。