PHPのcURLならPOST送信もらくらく!例を使って詳しく解説します

PHPのcURLを使うことで、外部のWebサイトにアクセスし、いろいろな情報を取得できます。そして、cURLを使うことで、GETやPOSTにより、外部のWebサイトにデータを送信することも可能です。

今回は、PHPによるスクレイピングに欠かせない、cURLによるPOST送信の基本とその使用例について解説します。

cURLの基本

PHPには、ファイルの内容を全て読み込むfile_get_contents関数を使い、ファイルの代わりにURLを指定して外部のサイトにアクセスする機能があります。しかし、file_get_contents関数はWebブラウザのような操作ができません。

そこで、よく利用されているのが、Webブラウザのような機能を提供する外部ライブラリのcURLです。まずは、このcURLの基本について解説します。

cURLは外部ライブラリとして導入する

cURLは、最初からPHPに組み込まれている関数ではなく、ダニエル・ステンバーグさんが開発したPHPの外部ライブラリです。そして、cURLを組み込んだPHPを利用することで、http通信やhttps通信はもちろん、ファイルのアップロード、クッキー、ユーザー認証などにも利用できます。

なお、Red Hat Enterprise LinuxやUbuntuなど、多くのLinuxディストリビューションのPHPでサポートされており、Linuxで利用する場合は、外部ライブラリであることを意識しないで利用できます。

ただし、サーバーによっては、cURLを組み込んでいないPHPを使っているケースもあるので、事前にチェックした方が良いでしょう。

cURLの基本的な使用方法

cURLを組み込んだPHPでは、curl_で始まる幾つかの関数が利用できます。そして、cURLの関数を使い、外部のサイトにアクセスするのに最低限必要な手順は次のとおりです。

(1) curl_init関数を使いcURLによるセッションを初期化する。
(2) curl_setopt関数を使い、各種オプションやアクセスする外部サイトのURLを指定する。
(3) curl_exec関数を使い外部サイトと通信する。
(4) curl_close関数でcURLによるセッションを閉じる。

この例では、「example.com」にアクセスし、そのページのHTMLを変数$html_strに格納しています。

cURLで使えるオプション

cURLは、curl_setopt関数でオプションを指定することで、外部サイトへのアクセスを制御できます。

なお、先ほど紹介した簡単な例では、curl_setoptで、CURLOPT_URLとCURLOPT_RETURNTRANSFERの2つのオプションを設定しました。このうち、CURLOPT_URLはアクセスする外部サイトのURLであり、CURLOPT_RETURNTRANSFERはcurl_execの戻り値を文字列とするオプションです。

外部サイトにアクセスし、その情報をPHPのプログラム内で利用する場合は、この2つのオプションは必須と言えるでしょう。

さらにcURLでは、curl_setopt関数でオプションを指定することで、GETやPOSTによるデータ送信や、クッキーを利用した通信なども可能です。今回は、POSTで送信する場合のオプションの使い方について、次から詳しく解説します。

cURL関数でGETまたはPOSTで送信する方法

先ほど説明したように、cURLを利用することで、外部サイトにアクセスしてそのページのHTMLを取得し、プログラム内で利用できます。さらに、オプションを指定することで、GET送信やPOST送信なども可能です。

次から、GETおよびPOSTによる外部サイトへのアクセス手順について解説します。

GET送信の手順

cURLは、curl_setopt関数でオプションを指定することで、外部サイトへのアクセスを制御できます。cURLによる基本的な外部サイトへのアクセス手順はGET送信です。

なお、GET送信では、URLに続けて変数と値を記述して、curl_exec関数で外部サイトにアクセスするだけで、変数と値を送れます。なお、CURLOPT_HTTPGETオプションで明示的にGET送信を指定するこも可能です。

この例では、url「example.com」に続けて、「?id=」で変数名「id」を指定、さらに$uidに格納した値を追加して、GET送信で外部サイトにアクセスし、そのページのHTMLを$http_strに格納しています。

POST送信の手順

cURLでPOST送信する場合は、curl_setopt関数でCURLOPT_POSTを設定し、さらに、CURLOPT_POSTFIELDSで送信する変数と値を設定します。

なお、CURLOPT_POSTFIELDSに指定する変数と値は、HTTP送信できる形式でなければなりません。そのため、配列で作成し、json_encode関数で変換してから渡します。なお、この変数の指定方法は後で詳しく解説します。

この例は、先ほどのGET送信と同じく、idという変数に$uidの値を指定し、「example.com」という外部サイトにアクセスし、そのページのHTMLを$http_strに格納しています。GET送信の例を比較してみてください。

暗号化通信の設定

Webサイトにアクセスするには、暗号化が必須です。特にPOST送信では、暗号化されていなければ、インターネット上では使えません。そのため、cURLはデフォルトで通信を暗号化します。

もし、外部サーバー側が暗号化に対応していない場合は、curl_setopt関数でCURLOPT_SSL_VERIFYPEERやCURLOPT_SSL_VERIFYHOSTのオプションを指定し、暗号化を解除しなければなりません。

cURLのPOST送信で変数を指定する方法

先ほど、cURLのPOST送信では、CURLOPT_POSTFIELDSで送信する変数と値を設定すると解説しましたが、解り難かったかもしれません。次から変数と値を指定する方法を詳しく説明します。

POST送信の変数名と値の送信方法

GET送信では、変数名と値をURLに続けて記述しましが、POST送信では、URLとは別の場所、具体的にはヘッダと呼ばれる箇所に記述します。ただし、HTTP通信におけるヘッダは、記述できるフォーマットが決まっており、変数と値もそれに合わせて記述しなければなりません。

なおcURLのPOST送信で変数名とその値を送信する場合、ヘッダを意識する必要はありません。先ほどの例のように、CURLOPT_POSTFIELDSで指定するだけです。ただし、事前に、ヘッダ内に記述できるフォーマットに変換しておく必要はあります。

cURLで指定できる変数名と値を作る方法

先ほど説明したように、cURLのPOST送信では、変数名とその値を事前にヘッダ内に記述できるフォーマットに変換する必要があります。そして、その変換に使用する関数が、json_encode関数です。

なお、json_encode関数は、ハッシュをヘッダ内に記述できるjsonフォーマットに変換する関数です。そして、POST送信したい変数名と値をハッシュに記述することで、ヘッダーに記載できるフォーマットに変換してくれます。

POST送信に使用するハッシュの作り方

POST送信に使用するハッシュの作り方は、変数名をハッシュのキーにし、また、POSTで送る値をそのキーのハッシュに代入します。例えば、POST送信するidという変数名に、「example」という文字列を格納した場合、ハッシュを次のように作成します。

また、下記のように複数の変数名と値も指定できます。

そして、先ほど紹介した例のように、json_encode関数を利用し、CURLOPT_POSTFIELDSで変数として、次のように指定します。

まとめ

これまで解説したように、PHPのcURLを利用することで、外部サーバーにアクセスすることが可能です。しかもGET送信やPOST送信によって変数を送信したり、今回は取り上げていませんがクッキーを利用することも可能です。

この機能を使うことで、外部のサーバーの情報を集めるスクレイピングや、公開する予定のWebサーバーを自動でテストするプログラムなど、いろいろな用途で使えます。ぜひ使い方をマスターして、仕事に活かしてください。

BLOGコンテンツをパーソナライズします

あなたは現在「プログラミング学習者」ですか?