PHPにおけるcurl_init()エラーへの対応【Ubuntu】

PHPにおけるcurl_init()エラーへの対応【Ubuntu】 プログラミング
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関数の動作確認を説明しました。

タイトルとURLをコピーしました