Cookieの罠。PHP(サーバー側)からCookieを取得・設定すると遅延する!?

takahashi 著者:takahashi

Cookieの罠。PHP(サーバー側)からCookieを取得・設定すると遅延する!?

今回、盛大にハマったので記事にします。

詳細はいろいろな事情があって公開できないので、それっぽいコードで説明します。
いま、PHPを使ったWebアプリを開発しているのですが、このアプリはいろいろな事情からCookieを多用する設計になっています。

そしてこのCookieは基本的にPHP側(サーバーサイド)で書き込みを行うようにしています。PHPで書いた方が処理が簡単だったからです。

フレームワークとしてFuelPHPを使用しているので、下記の関数でCookieの操作ができます。

//Cookieの設定
Cookie::set(クッキーのキー, クッキーに格納する値, 有効期限, cookieを有効にするWebページのパス, cookieを有効にするドメイン, $secure = セキュアな接続の時のみ cookie を送信するか否か。, http経由での接続でのみ有効にするか否か);

//Cookieの呼び出し
Cookie::get(クッキーのキー, クッキーが取得できなかった時に返す値);

詳しくはこちらを参照してください。
Cookie クラス – FuelPHP 日本語マニュアル

で、例えば下記のようなコードを書いたとします。

$a="hoge"
$result = Cookie::set("testkey",$a); //Cookieの送信に成功すればtrueを返す。
$b = Cookie::get("testkey",""); //書き込んだCookieを取得。

echo $result;
var_dump($a); //①
var_dump($b); //②

としたときに、$resultが”true”になっていれば、①と②の出力結果は同一のものになる、のが期待する動作なのですが、場合によって、②の時点での$bの値が”hoge”ではなく””になってしまうという事態が今回発生しました。

そんな馬鹿なと何度も確認したり、Cookie::setする前に対象のキーを削除したりいろいろ試したのですが、解決せず。

ここでふと、Google Chromeに、自分が保持しているクッキーの一覧が表示できる機能があったことを思い出し、こちら側でも確認してみました。

調査したいページを開いた状態でChromeの開発者ツール内のApplicationタブを開き、左側カラムの

Storage->Cookies->対象のサイトのURL

と辿っていくと、そのURLで保存されているCookieの一覧を見ることができます。

PHPがわの表示といっしょに、こちらの値の変化も確認していたところ、ブラウザ側で見たCookie”testkey”の値にはちゃんと期待した値の”hoge”という文字列が見えていました。

サーバーサイドからブラウザにCookieを渡す場合、実際にはHTTPのレスポンスヘッダに値を入れてブラウザに渡しています。
ブラウザからWebサーバーに対して接続した際に、基本的に応答が返ってくるまでに少し時間がかかります。

よくよく考えれば、サーバーに対しての通信で多少の遅延が発生するのなら、ブラウザへ値を保存する際に遅延が発生しても不思議ではないですよね。

今回はこの遅延が原因で、サーバーサイドで値がうまく取れなかったのではないか、と結論付けました。

…ということで、Cookieの値を保存・取得する際は、多少遅延が発生する可能性があるのでCookieを扱う際は注意が必要かも…というお話でした(;´∀`)

  • この記事いいね! (0)

著者について

takahashi

takahashi administrator

Webエンジニア。 趣味で自宅サーバーを稼働中。 ファンタジーが好き。