HTTPプロトコルのコンテキストの記述から、stream_context_create()でコンテキストリソースを作成します。そしてそれをfile_get_contents()の引数とすることで、UserAgentなどの任意のHTTPヘッダを設定することが可能です。
複数の情報を指定する場合には、それぞれを改行文字 (\r\n) で区切り連結します。
$options = array(
'http'=>array(
'method'=>'GET',
'header'=>"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n".
"Accept-language: ja\r\n"
)
);
$context = stream_context_create( $options );
$contents = file_get_contents( 'http://example.com', FALSE, $context );
なおヘッダ情報を指定せずにfile_get_contents()を使用したときには、HTTPの要求メッセージは
GET / HTTP/1.0\r\n Host: www.yahoo.com\r\n \r\n
のようになります。(PHP 5.2.8において、Microsoft Network Monitorにて確認)
前述の方法を用いれば、リクエストにクッキーの情報を含められます。
$options = array(
'http'=>array(
'method'=>'GET',
'header'=>'Cookie: name1=value1; name2=value2\r\n'
)
);
POSTメソッドを使用する場合、データがテキストならばヘッダに「Content-Type: application/x-www-form-urlencoded」を含める必要があります。
$url = 'http://example.com/';
$queries = array( 'a'=>1, 'b'=>2 );
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.strlen( http_build_query( $queries ) )
);
$options = array(
'http'=>array(
'method'=>'POST',
'header'=>implode( "\r\n", $headers ),
'content'=>http_build_query( $queries )
)
);
// ストリームコンテキストの作成
$stream = stream_context_create( $options );
// ファイルのオープン
$contents = file_get_contents( $url, FALSE, $stream );
同様の処理をcURLで行うなら、
$url = 'http://example.com/'; $queries = array( 'a'=>1, 'b'=>2 ); $curl = curl_init( $url ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt( $curl, CURLOPT_POSTFIELDS, http_build_query( $queries ) ); $response = curl_exec( $curl ); curl_close( $curl );
のようになります。このときもデータがテキストの場合には、http_build_query()などで先にデータを文字列に変換する必要があります。さもなくばContent-Typeがmultipart/form-dataとなり、バイナリとして処理されてしまいます。