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
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

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