【PHP8.x】COOKIE定数の使い方

COOKIE定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

COOKIE定数は、PHPのDateTimeImmutableクラスで使用される特定の日時フォーマットを表す定数です。この定数は、主にHTTPクッキーの有効期限を示す際に必要とされる、標準的な日時フォーマットを定義しています。Webアプリケーションにおいて、ブラウザにクッキーを送信する際に、その有効期限をRFC(Request For Comments)に準拠した形式で指定するために非常に役立ちます。

具体的には、「D, d M Y H:i:s T」というフォーマット文字列に相当し、「Thu, 01 Jan 1970 00:00:00 GMT」のような形式の日時文字列を生成するために利用できます。これは、HTTPプロトコルの仕様に適合した日時表現であり、異なるシステム間での日時情報の正確なやり取りを保証するために重要です。

DateTimeImmutableオブジェクトのformat()メソッドにこのCOOKIE定数を渡すことで、指定された日時オブジェクトをこの標準フォーマットの文字列に簡単に変換できます。これにより、手動で複雑なフォーマット文字列を記述する手間を省き、フォーマットに関するエラーのリスクを低減することができます。COOKIE定数を使用することは、HTTPクッキーの有効期限設定において常に正しい日時フォーマットを適用し、Webの相互運用性とセキュリティを確保する上で不可欠な要素です。

構文(syntax)

1<?php
2
3$dateTime = new DateTimeImmutable();
4echo $dateTime->format(DateTimeImmutable::COOKIE);
5
6?>

引数(parameters)

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHPでCookieを削除する

1<?php
2
3/**
4 * 指定された名前のクッキーを削除します。
5 * クッキーを削除するには、値を空にし、有効期限を過去に設定します。
6 *
7 * 重要: クッキーを削除するためには、setcookie() の $path, $domain, $secure, $httponly の引数が、
8 *      元のクッキーを設定した際と同じである必要があります。
9 *      これらの引数が一致しない場合、ブラウザは目的のクッキーを削除しない可能性があります。
10 *
11 * @param string $name クッキーの名前
12 * @param string $path オプション。クッキーのパス。デフォルトは '/'。
13 * @param string $domain オプション。クッキーのドメイン。デフォルトは空(現在のドメイン)。
14 * @param bool $secure オプション。クッキーが HTTPS 接続でのみ送信されるべきか。デフォルトは false。
15 * @param bool $httponly オプション。JavaScript からアクセスできないようにするか。デフォルトは false。
16 * @return bool クッキーの削除ヘッダーが正常に送信されたかどうか (HTTP ヘッダーがまだ送信されていない場合のみ成功します)
17 */
18function deleteCookie(
19    string $name,
20    string $path = '/',
21    string $domain = '',
22    bool $secure = false,
23    bool $httponly = false
24): bool {
25    // クッキーを削除するために、値を空にし、有効期限を過去に設定します。
26    // time() - 3600 は現在時刻より1時間前のUnixタイムスタンプであり、これによりブラウザにクッキーを削除するよう促します。
27    $expirationTime = time() - 3600;
28
29    return setcookie($name, '', $expirationTime, $path, $domain, $secure, $httponly);
30}
31
32// --- 使用例 (このコードは直接実行しても効果はありません。HTTPリクエストの一部として実行する必要があります) ---
33
34// 'user_session' という名前のクッキーを削除する例
35// deleteCookie('user_session');
36
37// 特定のパスとドメイン、セキュア属性とHTTPオンリー属性を持つ 'tracking_id' クッキーを削除する例
38// 例えば、元のクッキーが以下のように設定されていた場合:
39// setcookie('tracking_id', 'some_value', time() + 3600, '/app/', 'example.com', true, true);
40// そのクッキーを削除するには、同じ引数を使用します:
41// deleteCookie('tracking_id', '/app/', 'example.com', true, true);
42
43// ------------------------------------------------------------------------------------------------

このPHPコードは、指定された名前のクッキーを削除するためのdeleteCookie関数を定義しています。クッキーを削除するには、setcookie()関数を使用して、クッキーの値を空に設定し、有効期限を過去の日時に設定する必要があります。

deleteCookie関数は、以下の引数を受け取ります。

  • $name: 削除するクッキーの名前(必須)。
  • $path: クッキーのパス(省略可能、デフォルトは'/')。
  • $domain: クッキーのドメイン(省略可能、デフォルトは空文字列で現在のドメイン)。
  • $secure: クッキーがHTTPS接続でのみ送信されるかどうか(省略可能、デフォルトはfalse)。
  • $httponly: JavaScriptからのアクセスを禁止するかどうか(省略可能、デフォルトはfalse)。

関数は、クッキーの削除ヘッダーが正常に送信されたかどうかを示すブール値を返します。ただし、HTTPヘッダーが既に送信されている場合は、常にfalseを返します。

重要な注意点: クッキーを正しく削除するには、setcookie()でクッキーを設定した際と全く同じ$path$domain$secure$httponly引数を指定する必要があります。これらの引数が一致しない場合、ブラウザはクッキーを削除しない可能性があります。

例として、'user_session'という名前のクッキーを削除する場合、deleteCookie('user_session');のように呼び出します。また、パスやドメインなどが指定されたクッキーを削除する場合は、deleteCookie('tracking_id', '/app/', 'example.com', true, true);のように、同じ引数を指定します。

PHPでクッキーを削除する際の注意点です。クッキーを削除するには、setcookie()関数で値を空にし、有効期限を過去に設定します。

重要な点として、削除時にpathdomainsecurehttponlyの引数が、クッキー設定時と完全に一致している必要があります。もしこれらの引数が異なると、ブラウザはクッキーを削除できない可能性があります。

サンプルコードでは、deleteCookie()関数でこれらの引数を指定できるようにしています。クッキーが削除されない場合は、引数の値が正しいか確認してください。また、setcookie()関数はHTTPヘッダーを送信するため、HTMLコンテンツより前に実行する必要があります。ヘッダーが既に送信されている場合、クッキーの削除は失敗します。

PHP Cookie 設定と取得を体験する

1<?php
2
3/**
4 * DateTimeImmutable::COOKIE 定数を使用してクッキーの有効期限を設定し、そのクッキーを取得するサンプルです。
5 *
6 * DateTimeImmutable::COOKIE は、Webクッキーの有効期限などで使用される RFC 822 形式の日付フォーマット文字列 ("D, d M Y H:i:s T") を提供します。
7 * このサンプルでは、この定数を使って現在時刻から1時間後の日付文字列を生成し、クッキーの有効期限として設定します。
8 */
9
10/**
11 * クッキーの設定と取得を処理する関数
12 *
13 * @return void
14 */
15function handleCookieExample(): void
16{
17    // 1. クッキー名と値を定義
18    $cookieName = 'my_app_cookie';
19    $cookieValue = 'Hello from PHP Cookie!';
20
21    // 2. DateTimeImmutable::COOKIE フォーマットを使用して有効期限を生成
22    // 現在から1時間後の日時オブジェクトを作成
23    $dateTime = new DateTimeImmutable('+1 hour');
24    // DateTimeImmutable::COOKIE 定数で指定された形式で日付文字列をフォーマット
25    $expireTimeFormatted = $dateTime->format(DateTimeImmutable::COOKIE);
26
27    // 3. クッキーを設定
28    // setcookie() は、ブラウザにクッキーを送信する命令です。
29    // 同じリクエスト内では $_COOKIE には反映されず、次のリクエストから有効になります。
30    if (!isset($_COOKIE[$cookieName])) {
31        // setcookie のオプションを配列で渡す(PHP 7.3以降推奨)
32        setcookie(
33            $cookieName,
34            $cookieValue,
35            [
36                'expires' => strtotime($expireTimeFormatted), // 有効期限をUnixタイムスタンプで指定
37                'path' => '/',                                // クッキーが有効なパス (通常はサイト全体 '/')
38                'secure' => false,                            // HTTPS接続でのみ送信するか (開発環境では false でも可)
39                'httponly' => true,                           // JavaScriptからのアクセスを禁止するか (セキュリティ強化)
40                'samesite' => 'Lax'                           // CSRF対策 (Lax, Strict, None)
41            ]
42        );
43        echo "クッキー '{$cookieName}' を設定しました。<br>";
44        echo "設定された有効期限: {$expireTimeFormatted}<br>";
45        echo "このクッキーは、ブラウザがページを再読み込みした後に利用可能になります。<br><br>";
46    } else {
47        echo "クッキー '{$cookieName}' は既に設定されています。<br><br>";
48    }
49
50    // 4. クッキーの取得
51    // $_COOKIE スーパーグローバル変数から、既にブラウザから送信されたクッキーを取得できます。
52    // setcookie() で設定したばかりのクッキーは、この現在のリクエストでは取得できません。
53    if (isset($_COOKIE[$cookieName])) {
54        echo "ブラウザから送信されたクッキー '{$cookieName}' の値: " . htmlspecialchars($_COOKIE[$cookieName]) . "<br>";
55    } else {
56        echo "クッキー '{$cookieName}' はまだ取得できません。ページをリロードして確認してください。<br>";
57    }
58
59    echo "<br>";
60
61    // 参考:DateTimeImmutable::COOKIE 定数そのものの値
62    echo "DateTimeImmutable::COOKIE 定数の値: " . DateTimeImmutable::COOKIE . "<br>";
63}
64
65// 関数を実行して、クッキーの処理を開始
66handleCookieExample();
67
68?>

このサンプルコードは、PHPでWebクッキーを設定し、その値を取得する方法を示しています。特にDateTimeImmutable::COOKIE定数を使って、クッキーの有効期限をRFC 822形式で正しくフォーマットする点に焦点を当てています。

DateTimeImmutable::COOKIEは、Webクッキーの有効期限として標準的に使用される日付形式「D, d M Y H:i:s T」(例: "Thu, 01 Jan 2025 12:00:00 GMT")を定義する文字列定数です。この定数自体は引数を受け取らず、戻り値もありませんが、DateTimeImmutableオブジェクトのformat()メソッドに渡すことで、指定された形式の日付文字列を生成するために利用されます。

サンプルではまず、現在時刻から1時間後の日時を表すDateTimeImmutableオブジェクトを作成し、DateTimeImmutable::COOKIE定数を使ってこの日時をクッキーの有効期限フォーマットに変換しています。次に、setcookie()関数を用いて、指定したクッキー名と値、そして生成した有効期限を含むオプションを設定し、ブラウザにクッキーを送信するよう指示しています。setcookie()関数はブラウザにクッキーを送信する命令であり、この関数を実行した直後の同じリクエスト内では、設定したクッキーはまだPHPの$_COOKIEスーパーグローバル変数には反映されません。これは、クッキーがブラウザから次のリクエストでサーバーに送り返されるためです。

その後、$_COOKIE変数を使って、既にブラウザからサーバーに送信されたクッキーの値を参照しています。初めてページを読み込んだ際はsetcookie()で設定されたクッキーはすぐには取得できず、ページを再読み込みすることで$_COOKIEから取得できるようになる仕組みも示されており、PHPでのクッキーのライフサイクルと、設定と取得のタイミングを理解することができます。

setcookie()関数でクッキーを設定しても、同じリクエスト内では$_COOKIEスーパーグローバル変数に即座には反映されません。設定されたクッキーは、ブラウザが次のリクエストを送信した際に初めて利用可能になりますので、ページを再読み込みして確認してください。

DateTimeImmutable::COOKIE定数は、Webクッキーの有効期限などで使用される日付フォーマット文字列を定義しています。しかし、setcookie()関数のexpiresオプションには、このフォーマット文字列ではなく、strtotime()関数などで変換したUnixタイムスタンプを渡す必要があります。

クッキーを設定する際は、secure(HTTPS接続のみ)、httponly(JavaScriptからのアクセス禁止)、samesite(CSRF対策)などのセキュリティオプションを適切に設定することが重要です。特に本番環境ではsecuretrueに設定し、$_COOKIEから取得した値を出力する際は、クロスサイトスクリプティング(XSS)攻撃を防ぐためhtmlspecialchars()関数などでエスケープ処理を必ず行ってください。

【PHP8.x】COOKIE定数の使い方 | いっしー@Webエンジニア