PHPプロ!TIPS+

スクリプト上で楽にデータをPOST送信しよう

Webサイトを構築していると様々な形でデータを送信する必要がでてきます。例えば、Ping送信のように多数のサイトへ同じデータを渡すこともあるでしょう。特に、データサイズが大きい場合や、トラックバックのようにPOST形式で送信しなければならないこともあります。そこで今回はスクリプト内で POST送信を実行する簡単な方法を紹介します。

PHPに組み込まれている関数のみでデータをPOSTする場合、HTTPヘッダを自分で作成し、これにデータを付加しなければなりません。例えば、以下のようになります。

<?php
$data 
'hoge=' urlencode($value)
     . 
'&name=' urlencode($name);

$post "POST http://www.example.com/test.php HTTP/1.1\r\n"
      
"Host: www.example.com\r\n"
      
"Content-Type: application/x-www-form-urlencoded\r\n"
      
"Content-Length: " strlen($data) . "\r\n\r\n"
      
$data ."\r\n";
?>

ご覧の通りいささか面倒です。そこでこの労力を軽減してくれるパッケージを2つ紹介したいと思います。PEAR::HTTP_Requestと Zend_Http_Clientです。

1. PEAR::HTTP_Request

PEAR::HTTP_RequestはNet_URLとNet_Socketパッケージに依存しています。インストールするときは、

pear install --alldeps HTTP_Request

のように--alldepsオプションを用いて依存関係にあるパッケージも一緒にインストールすると便利です。

HTTP_Requestの使い方は簡単です。インスタンスを作成し、メソッドを指定します。必要なデータとURLを登録し、sendRequestメソッドで指定URLへデータを送信します。

<?php
require_once 'HTTP/Request.php';

// ソケットを開き、送信形式を指定し、データを送信する
$req = new HTTP_Request();
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addPostData('hoge'$value);
$req->addPostData('name'$name);

// $uri_list = array(uri1, uri2, ...)とする
foreach ($uri_list as $uri) {
  
// 送信先を設定し、レスポンスを取得する
  
$req->setURL($uri);
  
  if (!
PEAR::isError($req->sendRequest())) {
    
$response $req->getResponseBody();
  }
}
?>

2. Zend_Http_Client

このクラスはZendフレームワーク(http://framework.zend.com/)で提供されています。本家のサイトからダウンロードして下さい。

使い方はインスタンスにデータとURLを渡し、送信するだけです。ただし、ただし、現在のバージョン(執筆当時 バージョン0.2.0)ではヘッダ情報で"Content-Type:application/x-www-form-urlencoded"を指定しなければなりません。

<?php
require_once 'Zend/Http/Client.php';

// 送信するデータを整形する
$data 'hoge=' urlencode($value) . '&name=' urlencode($name);
$headers array("Content-Type: application/x-www-form-urlencoded");

// インスタンスを作成する
$http = new Zend_Http_Client();
$http->setHeaders($headers);

// $uri_list = array(uri1, uri2, ...)とする
foreach ($uri_list as $uri) {
  
// HTTP POSTリクエストを送信し、HTTPレスポンスを取得する
  
$http->setUri($uri);
  
$httpResponse $http->post($data);
}
?>

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)