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となり、バイナリとして処理されてしまいます。