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

最もシンプルな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.co.jpに設定しています。上記の内容を記載したphpファイルを作成して、そのファイルにブラウザからアクセスするとブラウザ上には、googleのトップページが表示されます。

curlでgoogleトップにアクセス

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

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

先ほどは、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のページが表示されます。

htmlspecailchars関数を使用して表示した結果

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オプションを設定する */
   $optios = [
       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_HTTP_CODEオプションを指定して使用します。


    /* HTTPステータスコードのみ取得 */
    $http_code= curl_getinfo($ch, CURLINFO_HTTP_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を使用しているようです。

まとめ

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