【PHP】file_get_contents関数でセッションやCOOKIEを送信する

公開日:
更新日:
カテゴリー: PHP

file_get_contents関数を使って相手ページにセッションやCOOKIEを持ってアクセスする方法をまとめています。

これを活用すると、ログインが必要なサイトや複次的なアクセスをしないと得られないコンテンツを取得することが可能になります。

セッションやCOOKIEを送信

file_get_contents関数でセッションやCOOKIEを送信するには次のようなコードを書けばOKです。

<?php
//初回アクセス
//コンテンツ取得先
$url = "";

//ヘッダーの設定
$header = array(
		"Content-Type: application/x-www-form-urlencoded",
		);

//オプション設定
$options =array(
		'http' =>array(
				'method' => "GET",
				'header' => implode("\r\n", $header),
				)
		);

//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));

//2回目のアクセス
//COOKIE情報を格納する配列を定義
$array_cookie = array();

//レスポンスヘッダーからCOOKIE情報を取り出して一つずつ配列に格納する
foreach($http_response_header as $value){

	if(preg_match( "/Set-Cookie: (.*?);/", $value, $matches)){
		$array_cookie[] = "Cookie: {$matches[1]}";
	}
}

//コンテンツ取得先
$url = "";

//ヘッダーの設定
$header = array(
		"Content-Type: application/x-www-form-urlencoded",
		);

//ヘッダーにCOOKIE情報を追加
$header = array_merge($header, $array_cookie);

//オプション設定
$options =array(
		'http' =>array(
				'method' => "GET",
				'header' => implode("\r\n", $header),
				)
		);

//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));

//出力
print_r($contents);
?>

このコードをみてわかるように、処理の流れが複雑なので、なるべく簡単にして流れを追っていきたいと思います。

概要

まず処理の流れをまとめるとこのようになります。

  1. 初回アクセス
    file_get_contents関数で相手ページ①にアクセスする
  2. 相手側ページ①
    アクセスしてきたユーザーにセッションやCOOKIEを渡す
  3. 2回目アクセス
    渡されたセッションIDやCOOKIEを抽出して、それを保持して相手ページ②にアクセスする
  4. 相手側ページ②
    アクセスしてきたユーザーのセッションやCOOKIEを表示する

文章だと頭に入ってこないので図示します。

※実際は相手側ページは一つの場合が多いですが、ここでは説明上分けます

セッションやCOOKIEを受け取る

まずは画像の上半分の処理を順に説明していきます。

自分側のコード

自分側には次の2つの処理を行うコードを記述します。

  1. file_get_contents関数で相手側にアクセスする
  2. アクセス後にレスポンスヘッダー($http_response_header)を確認する
<?php
//コンテンツ取得先
$url = "";

//ヘッダーの設定
$header = array(
		"Content-Type: application/x-www-form-urlencoded",
		);

//オプション設定
$options =array(
		'http' =>array(
				'method' => "GET",
				'header' => implode("\r\n", $header),
				)
		);

//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));

//レスポンスヘッダーの確認
print_r($http_response_header);
?>

相手側ページ①のコード

相手側ページ①にはアクセスがあった場合にセッションとCOOKIEを発行するコードを書きます。

<?php
//セッションスタート
session_start();
//セッション設定
$_SESSION["sports1"] = "soccer";
$_SESSION["sports2"] = "baseball";
//セッションエンド
session_write_close();

//COOKIEの設定
setcookie("fruits1", "banana", time()+60*60*24);
setcookie("fruits2", "orange", time()+60*60*24);
?>

これをみるとわかるように、アクセスしてきたユーザーには次の情報を渡します。

  • セッション名「sports1」、値「soccer」
  • セッション名「sports2」、値「baseball」
  • COOKIE名 「fruits1」、値「banana」
  • COOKIE名 「fruits2」、値「orange」

実際の場合、セッション情報はサーバー内で保管し、相手にはセッションIDのみ渡すので次のようになります。

  • セッションID(ランダムな文字列)
  • COOKIE名 「fruits1」、値「banana」
  • COOKIE名 「fruits2」、値「orange」

ここまでを実行

実際に、自分側→相手側へアクセスすると、レスポンスヘッダーには次の情報が入ります。

Array
(
    [0] => Cookie: PHPSESSID=bakokni5ade6qhh13ag8s3aj92
    [1] => Cookie: fruits1=banana
    [2] => Cookie: fruits2=orange
)

つまり、file_get_contents関数でセッションやCOOKIEを送信するには、次のアクセス(2回目のアクセス)で上の情報を保持してアクセスする必要があります。

セッションやCOOKIEを保持してアクセスする

次に、画像の下半分の処理を説明します。

自分側のコード(追記)

セッションやCOOKIEを保持してアクセスする方法ですが、自分側に次のコードを追記します。

<?php
//COOKIE情報を格納する配列を定義
$array_cookie = array();

//レスポンスヘッダーからCOOKIE情報を取り出して一つずつ配列に格納する
foreach($http_response_header as $value){

	if(preg_match( "/Set-Cookie: (.*?);/", $value, $matches)){
    	$array_cookie[] = $matches[1];
	}
}

//コンテンツ取得先
$url = "https://2pqq.c.time4vps.cloud/000program/ysklog-tool/test/index3.php";

//ヘッダーの設定
$header = array(
		"Content-Type: application/x-www-form-urlencoded",
		);

//ヘッダーにCOOKIE情報を追加
if(count($array_cookie) >= 1) $header[] = "Cookie: " . implode("; ", $array_cookie);

//オプション設定
$options =array(
		'http' =>array(
				'method' => "GET",
				'header' => implode("\r\n", $header),
				)
		);

//コンテンツ取得
$contents = file_get_contents($url, false, stream_context_create($options));

//出力
print_r($contents);
?>

相手側ページ②のコード

相手側ページ②には送信されてきたセッション情報とCOOKIEを出力するコードを書きます。

<?php
//セッションスタート
session_start();
//セッションエンド
session_write_close();

echo "<p>【セッション一覧】</p>";
print_r($_SESSION);

echo "<p>【COOKIE一覧】</p>";
print_r($_COOKIE);
?>

ここまでを実行

ここまでを実行すると、しっかりと相手側にセッションIDとCOOKIEを送信できていることがわかります。

【セッション一覧】

Array
(
    [sports1] => soccer
    [sports2] => baseball
)

【COOKIE一覧】

Array
(
    [PHPSESSID] => an7s7tmg9vlan9ai64pbimt195
    [fruits1] => banana
    [fruits2] => orange
)

以上、簡単にfile_get_contents関数でCOOKIE(セッションID含む)を送信する方法でした。

 

あわせて読んでほしい!

 

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント