cURLはAPIだけではなく、さまざまな用途に使用できる汎用性の高いPHPのライブラリです。cURLを理解できればPHPのプログラムからクラウドサービスのデータにもAPIを通して簡単にアクセスできます。cURLを利用した経験がない人はぜひこの機会にcURLをマスターしてください。

PHPで記述したコードを動作させるためにはPHPのプログラムを動作させるための環境が必要です。環境を構築しない状態でWindowsパソコンでphpのプログラムを記述しても動作しないので注意してください。

最もシンプルなcURLの使用方法

cURLを使用したリクエストは4つのステップで構成されています。非常にシンプルなのでこの流れだけはしっかりと覚えてください。

  1. curlセッションを初期化する
  2. curlのオプションを設定する
  3. curlを実行する
  4. curlセッションを終了する

PHPで書かれた実際のプログラムコードを見ながら上記の流れを確認してみましょう。


<?php

/* curlセッションを初期化する */
$ch = curl_init();

/* curlオプションを設定する */
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");

/* curlを実行する */
curl_exec($ch);

/* curlセッションを終了する */
curl_close($ch);

curlオプションで、アクセスするURLをhttp://www.google.comに設定しています。httpではなくhttpsでも動作します。上記の内容を記載したphpファイルを作成してそのファイルにブラウザからアクセスするとブラウザ上には、googleのトップページが表示されます。

Googleのページの表示
Googleのページの表示

これが最も簡単なcurlの使用方法です。curlオプションにアクセスするサーバのURLを指定するだけで、サーバからデータを取得して取得したデータをブラウザ上に表示させることができました。

PHPの開発サーバを利用

作成したphpファイルをアップするWEBサーバがない場合はPHPの開発サーバを利用して動作確認を行うことができます。コードを記述したファイルが保存されたディレクトリの中で以下のコマンドを実行します。


 % php -S localhost:8000
PHP 8.3.1 Development Server (http://localhost:8000) started

ブラウザからhttp://localhost:8000にアクセスするとGoogleの画面が表示されます。ここでは作成したファイル名はindex.phpとしています。

サーバから取得した内容を保存する

先ほどは、curl_execを実行するとgoogle.comのトップページの内容がブラウザに表示されました。curlオプションにCURLOPT_RETURNTRANSFERを設定するとサーバから取得した情報を保存することができます。


<?php

/* curlセッションを初期化する */
$ch = curl_init();

/* curlオプションを設定する */
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

/* curlを実行し、その内容を$result変数に保存 */
$result = curl_exec($ch);

/* curlセッションを終了する */
curl_close($ch);

/* result変数に保存した内容を表示 */
echo htmlspecialchars($result);

上記では、サーバから取得して保存した内容を文字列として表示させるためにecho, htmlspecailchars関数を利用しています。もしhtmlspecailchars関数を使用しない場合は、先ほどと同じように画面には、googleのページが表示されます。

取得した情報を文字列でブラウザに表示
取得した情報を文字列でブラウザに表示

curlオプションの設定方法

curl_setopt_array関数を使用するとcurl_setoptで複数行に分かれていたオプション設定行を1つの関数にまとめることができます。

【curl_setoptを使用する場合】


/* curlオプションを設定する */
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

【curl_setopt_arrayを使用する場合(1)】


/* curlオプションを設定する */
curl_setopt_array($ch,
[
    CURLOPT_URL            => "http://www.google.com/",
    CURLOPT_RETURNTRANSFER => true
]
);

【curl_setopt_arrayを使用する場合(2)】
オプションの部分のみ別の変数を準備して記述します。


/* curlオプションを設定する */
$options = [
    CURLOPT_URL            => "http://www.google.com/",
    CURLOPT_RETURNTRANSFER => true
];

curl_setopt_array($ch, $options);

セッション内の転送データに関する情報を取得する

curl_getinfo関数を使用するとHTTPステータスコードなどの転送データに関わる情報を取得することができます。


/* curlのセッション情報 */ 
$info = curl_getinfo($ch);

curl_getinfoの実行結果を見ると、HTTPステータスコードなどの確認を行うことができます。


array:23 [▼
  "url" => "http://www.google.com/"
  "content_type" => "text/html; charset=ISO-8859-1"
  "http_code" => 200
  "header_size" => 736
  "request_size" => 53
  "filetime" => -1
  "ssl_verify_result" => 0
  "redirect_count" => 0
  "total_time" => 0.156259
  "namelookup_time" => 3.3E-5
  "connect_time" => 0.019748
  "pretransfer_time" => 0.01975
  "size_upload" => 0.0
  "size_download" => 48669.0
  "speed_download" => 311463.0
  "speed_upload" => 0.0
  "download_content_length" => -1.0
  "upload_content_length" => 0.0
  "starttransfer_time" => 0.110592
  "redirect_time" => 0.0
  "redirect_url" => ""
  "primary_ip" => "2404:6800:4004:80b::2004"
  "certinfo" => []
]

HTTPステータスコードなど個別の値を取得することも可能です。その場合は、CURLINFO_RESPONSE_CODEオプションを指定して使用します。


/* curlを実行後のresponseのステータスコード */ 
$status_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);

curlのエラーを確認する方法

curlを実行した際に発生したエラーを確認するためにerror関数errno関数があります。


/* エラー番号を取得 */
curl_errno($ch);

/* エラーを取得 */
curl_error($ch)

実際に存在しないURL(amazon.co.j)にアクセスした場合、errnoは”6″が表示されます。errnoについては、正常に動作した場合は、0になります。errnoの番号の意味については、こちらから確認できます。”6″は、”CURLE_COULDNT_RESOLVE_HOST”という意味を表しています。

errnoが0の場合は、正常に動作しているので、エラーは出力されません。そのため、errnoが”0″以外になった場合のみエラーの情報を出力するようにプログラムを記述します。


if (curl_errno($ch)) {

  $error = curl_error($ch);

  echo $error;

}

URLの間違いがあるので、エラーの内容は”Couldn’t resolve host ‘www.amazon.co.j'”と表示されます。

【エラー発生のために実行した内容】


   /* curlセッションを初期化する */
   $ch = curl_init();

   /* curlオプションを設定する */
   curl_setopt_array($ch,[
         CURLOPT_URL            => "https://www.amazon.co.j/",
         CURLOPT_RETURNTRANSFER => true
      ]
   );

   /* curlを実行し、その内容を$result変数に保存 */
   $result = curl_exec($ch);

   if (curl_errno($ch)) {

      $error = curl_error($ch);

      echo $error;

   }

   /* curlセッションを終了する */
   curl_close($ch);

【補足】なぜ変数$chという名前を使用しているのか

curlの場合、セッションを保存する変数に$chを使用している場合が多いですが名前は任意でつけることが可能です。コンピューター用語には基本的には英語が利用されるため英語の用語の意味が分かればその機能の理解も深まる場合があるのでなぜchを使用しているのか調べてみました。

curl_initを実行すると新規セッションを初期化し、cURL ハンドル(handle)を戻すという動きをします。そのため、その2つの単語の頭文字を取ってchを使用しているようです。hはhandleから来ているようです。

まとめ

cURLを使ったサーバからのデータの取得方法とエラーの処理について説明を行いました。基礎的な内容しか説明していませんが、この基礎が理解できていれば、クラウドサービスのAPIへのアクセスも簡単に行うことができます。ぜひ、本書で理解したcURLの知識をつかっていろいろサービスにアクセスしてみてください。