【PHP8.x】DateTime::COOKIE定数の使い方
COOKIE定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
COOKIE定数は、PHPのDateTimeクラスに属し、HTTPクッキーの有効期限(Expires属性)を指定する際に使用される、特定の日付フォーマット文字列を表す定数です。具体的には、ウェブサーバーがクライアント(ウェブブラウザ)にクッキーを送信する際、そのクッキーがいつまで有効であるかを示すために国際的に定められた標準的な日付時刻の書式「l, d-M-Y H:i:s T」(例: Tuesday, 20-Dec-2022 10:30:00 UTC)を提供します。
システムエンジニアを目指す初心者の方にとって、ウェブアプリケーション開発ではユーザーのセッション管理やデータの永続化のためにクッキーが頻繁に利用されます。クッキーの有効期限を設定することは非常に重要であり、このCOOKIE定数はその際に役立ちます。
例えば、DateTimeオブジェクトで現在時刻や将来の時刻を作成し、そのオブジェクトのformat()メソッドの引数にDateTime::COOKIEを指定することで、手軽にクッキーのExpires属性に適合する日付文字列を生成できます。これにより、手動で複雑なフォーマット文字列を記述する手間を省き、タイプミスによるエラーを防ぎながら、HTTPの仕様に準拠した形でクッキーの有効期限を正確に設定することが可能になります。
この定数を使用することで、開発者はクッキー関連の機能をより安全かつ効率的に実装できるようになります。ウェブ標準に沿った日付フォーマットの利用は、異なるブラウザやシステム間での互換性を保証するためにも不可欠です。
構文(syntax)
1<?php 2echo DateTime::COOKIE; 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
DateTime::COOKIE は、HTTP Cookie の日付フォーマットを表す文字列 "D, d M Y H:i:s e" を返します。
サンプルコード
PHP DateTime::COOKIEでCookie日付フォーマットを生成する
1<?php 2 3/** 4 * DateTime::COOKIE 定数を使用して、HTTP CookieのExpires属性などで使われる 5 * 日付フォーマット文字列を生成するサンプルコードです。 6 * 7 * この定数自体はHTTP Cookieの値を「取得」するものではなく、 8 * HTTP Cookieの有効期限などを「設定」する際の日付書式を指定するために使用します。 9 */ 10function showDateTimeCookieFormat(): void 11{ 12 // DateTime::COOKIE 定数の値そのものを表示します。 13 // この定数は "D, d-M-Y H:i:s T" の形式の文字列を保持しています。 14 echo "DateTime::COOKIE 定数の値: " . DateTime::COOKIE . "\n\n"; 15 16 // 現在の日時を表すDateTimeオブジェクトを作成します。 17 $now = new DateTime(); 18 19 // DateTime::COOKIE フォーマット定数を使って、現在の日時を文字列に変換します。 20 // この形式は、HTTPヘッダーの 'Set-Cookie' で有効期限 (Expires) を設定する際に利用されます。 21 $formattedNow = $now->format(DateTime::COOKIE); 22 echo "現在の日時をDateTime::COOKIEフォーマットで表示: " . $formattedNow . "\n"; 23 24 // 例として、現在から1時間後の日時を作成し、Cookieの有効期限としてフォーマットします。 25 $expireTime = (new DateTime())->modify('+1 hour'); 26 $formattedExpireTime = $expireTime->format(DateTime::COOKIE); 27 echo "1時間後の日時をCookieの有効期限フォーマットで表示: " . $formattedExpireTime . "\n\n"; 28 29 // MEMO: 実際のHTTP Cookieを設定する場合、以下のようにExpires属性にこのフォーマット文字列を使います。 30 // このコードではHTTPヘッダーの出力は行いません。 31 // header("Set-Cookie: example_name=example_value; Expires=" . $formattedExpireTime . "; Path=/"); 32 echo "このフォーマットは、主にHTTP Cookieの有効期限を設定する際に利用される、標準的な日付形式です。\n"; 33} 34 35// サンプルコードを実行します。 36showDateTimeCookieFormat(); 37 38?>
DateTime::COOKIE定数は、PHPのDateTime拡張機能に属する定数で、HTTP CookieのExpires属性などで日付や時刻のフォーマットを指定するために使用されます。この定数自体はCookieの値を「取得」するものではなく、Cookieの有効期限を「設定」する際の日付書式を提供するものです。
DateTime::COOKIE定数は引数を取らず、戻り値として"D, d-M-Y H:i:s T"という形式の文字列を返します。この文字列は、Webサーバーとブラウザ間でCookieの有効期限をやり取りする際に標準的に使われる日付書式を定義しています。
サンプルコードでは、まずDateTime::COOKIE定数に格納されているフォーマット文字列そのものが表示されます。次に、new DateTime()で現在のDateTimeオブジェクトを作成し、そのformat()メソッドにDateTime::COOKIE定数を渡すことで、現在の日時をCookieの有効期限に適した形式に変換しています。例えば、Mon, 01-Jan-2024 12:00:00 UTCのような形式で出力されます。さらに、現在から1時間後の日時を設定し、同様にフォーマットした例も示されており、実際のHTTPヘッダーのSet-CookieでExpiresの値としてこの形式が利用されることを具体的に理解できます。
この定数を使用することで、開発者はHTTP Cookieの有効期限を設定する際に標準的な日付フォーマットを簡単に適用でき、ブラウザがCookieの有効期限を正確に解釈できるようになります。
DateTime::COOKIE 定数は、HTTP Cookieの値を「取得」するものではなく、主にCookieの有効期限(Expires属性)を設定する際に使用する標準的な日付フォーマット文字列「D, d-M-Y H:i:s T」を提供するものです。この定数自体は、書式指定のための文字列そのものを返します。
実際に現在の日時などをこのフォーマットで表示したい場合は、DateTime オブジェクトの format() メソッドに引数として DateTime::COOKIE を渡して利用します。これにより、Webブラウザが正しく解釈できるCookieの有効期限文字列を安全に生成できます。実際のCookieの送受信処理には setcookie() 関数や $_COOKIE グローバル変数など、別のPHP機能を使用することになりますので、用途の違いにご注意ください。
PHPでCookieを削除する
1<?php 2 3/** 4 * 指定された名前のCookieを削除する関数。 5 * Cookieを削除するには、ブラウザに対し有効期限が過去のCookieを再設定することで削除を促します。 6 * 7 * @param string $name 削除するCookieの名前。 8 * @param string $path Cookieのパス。設定時と同じパスを指定する必要があります。 9 * @param string $domain Cookieのドメイン。設定時と同じドメインを指定する必要があります。 10 * @param bool $secure HTTPS接続でのみCookieを送信するかどうか。設定時と同じ値を指定する必要があります。 11 * @param bool $httponly JavaScriptからアクセスできないようにするかどうか。設定時と同じ値を指定する必要があります。 12 */ 13function deleteCookie( 14 string $name, 15 string $path = '/', 16 string $domain = '', 17 bool $secure = false, 18 bool $httponly = false 19): void { 20 // Cookieの有効期限を過去に設定することで、ブラウザにCookieの削除を促します。 21 // DateTime::COOKIE はクッキーの日付フォーマット(例: "Wed, 23-Nov-2022 10:00:00 GMT")を表す定数ですが、 22 // setcookie() 関数は有効期限としてUNIXタイムスタンプ(整数)を要求します。 23 // ここでは現在時刻より1時間前のタイムスタンプを使用します。 24 $pastTime = new DateTime(); 25 $pastTime->modify('-1 hour'); 26 $expirationTimestamp = $pastTime->getTimestamp(); 27 28 // setcookie() を呼び出します。Cookieを設定した時と同じ$path, $domain, $secure, $httponlyの値を 29 // 指定することが非常に重要です。これらの値が一致しないとCookieは削除されません。 30 // この関数はHTTPヘッダーを送信するため、プログラムの他の出力よりも前に呼び出す必要があります。 31 setcookie($name, '', $expirationTimestamp, $path, $domain, $secure, $httponly); 32 33 echo "Cookie '{$name}' の削除リクエストを送信しました。" . PHP_EOL; 34} 35 36// --- 使用例 --- 37// 実際にCookieの削除を確認するには、このスクリプトを実行する前に 38// 対象のCookieがブラウザに設定されている必要があります。 39// 例: setcookie('my_app_cookie', 'user_session_id', time() + 3600, '/', '', false, true); 40 41// 'my_app_cookie' という名前のCookieを削除する例。 42// このCookieがパス '/'、ドメイン空(現在のドメイン)、secure=false、httponly=true で 43// 設定されていると仮定します。設定時の引数に合わせて変更してください。 44deleteCookie('my_app_cookie', '/', '', false, true); 45 46// 特定のパスを持つCookieを削除する場合の例: 47// deleteCookie('admin_cookie', '/admin/', 'example.com', true, true); 48 49?>
PHPでCookieを削除するサンプルコードです。Cookieは、有効期限が過去の同じ名前のCookieをブラウザに再送信することで削除されます。
このコードは、指定されたCookieを削除するdeleteCookie関数を定義しています。引数$nameは削除するCookieの名前です。$path、$domain、$secure、$httponlyには、Cookie設定時とまったく同じ値を指定することが重要です。一致しない場合、削除は行われません。
関数内部では、現在時刻より前のUNIXタイムスタンプを算出し、setcookie()関数でCookieの有効期限を過去に設定しています。setcookie()関数はHTTPヘッダーを送信するため、プログラムが出力を行う前に呼び出す必要があります。
DateTime::COOKIEはCookieの日付フォーマット定数ですが、setcookie()関数は有効期限にUNIXタイムスタンプ(整数)を要求するため、このコードでは直接使用していません。
この関数の戻り値はvoidで、Cookie削除の指示をブラウザに送信します。
Cookie削除には、setcookie関数でCookieを設定した時と全く同じpath、domain、secure、httponlyの値を指定することが非常に重要です。これらの値が一つでも異なるとCookieは削除されません。また、setcookie関数はHTTPヘッダーを送信するため、プログラムのechoなどの出力よりも前に呼び出す必要があります。DateTime::COOKIE定数は日付の書式を表すもので、setcookie関数の有効期限にはUNIXタイムスタンプ(整数)を指定します。このサンプルコードはCookieの削除リクエストをブラウザに送信するものですので、実際に削除されたかどうかはブラウザの開発者ツールで確認してください。
PHPでSameSite属性付きCookieを設定する
1<?php 2 3/** 4 * 安全なCookieを設定する関数。 5 * SameSite属性を含め、セキュリティを考慮したCookieを設定します。 6 * 7 * @param string $name Cookieの名前 8 * @param string $value Cookieの値 9 * @param int $expireInSeconds Cookieの有効期限(秒単位、デフォルトは1時間) 10 * @return void 11 */ 12function setSecureCookieWithSameSite( 13 string $name, 14 string $value, 15 int $expireInSeconds = 3600 // デフォルトは1時間後 16): void { 17 // 現在時刻から有効期限のDateTimeオブジェクトを作成 18 $expireDateTime = new DateTime(); 19 $expireDateTime->modify(sprintf('+%d seconds', $expireInSeconds)); 20 21 // setcookie関数の'expires'オプションにはUNIXタイムスタンプを渡す必要があります。 22 $expiresTimestamp = $expireDateTime->getTimestamp(); 23 24 // DateTime::COOKIE 定数は、HTTP Cookieの'expires'属性で使われる日付フォーマット(RFC 822形式)を示します。 25 // これは文字列定数であり、直接setcookie()の'expires'オプションには使えません。 26 // ここでは、そのフォーマットで有効期限を文字列として表示する例を示します。 27 echo "--- 設定しようとしているCookie情報 ---\n"; 28 echo "Cookie 名: '{$name}'\n"; 29 echo "Cookie 値: '{$value}'\n"; 30 echo "有効期限 (HTTP Cookie フォーマット): " . $expireDateTime->format(DateTime::COOKIE) . "\n"; 31 echo "有効期限 (UNIXタイムスタンプ): " . $expiresTimestamp . "\n"; 32 echo "--------------------------\n\n"; 33 34 // Cookieオプションを設定 35 $options = [ 36 'expires' => $expiresTimestamp, // 有効期限 (UNIXタイムスタンプ) 37 'path' => '/', // Cookieが有効なパス (通常はサイト全体で有効にするため '/') 38 'domain' => '', // Cookieが有効なドメイン (空の場合は現在のドメインに自動設定) 39 'secure' => true, // HTTPS接続でのみCookieを送信 (本番環境では常にtrueを推奨) 40 'httponly' => true, // JavaScriptからのアクセスを禁止 (XSS攻撃対策) 41 'samesite' => 'Lax', // SameSite属性 (Strict, Lax, None) 42 // 'Lax' が推奨されるデフォルト値で、CSRF攻撃などに対するセキュリティを向上させます。 43 // 'Strict' は最も厳格、'None' はクロスサイトでの送信を許可(要secure=true)。 44 ]; 45 46 // setcookie() 関数はHTTPヘッダーを送信するため、この呼び出しより前に 47 // HTML出力などの内容がないことを確認してください。 48 if (setcookie($name, $value, $options)) { 49 echo "Cookie '{$name}' が正常に設定されました。(ブラウザの開発者ツールで確認してください)\n"; 50 } else { 51 echo "Cookie '{$name}' の設定に失敗しました。\n"; 52 } 53} 54 55// --- 関数呼び出し例 --- 56// このPHPスクリプトをWebサーバー経由で実行し、ブラウザでアクセスしてください。 57// (例: コマンドラインで `php -S localhost:8000` を実行後、ブラウザで `http://localhost:8000` にアクセス) 58 59// セッションIDのような重要なCookieを7日間有効で設定 60setSecureCookieWithSameSite('session_id', 'user_session_abc123', 3600 * 24 * 7); 61 62// ユーザー設定のようなCookieを1時間有効で設定 63setSecureCookieWithSameSite('user_theme', 'dark_mode', 3600); 64 65// 注: このスクリプトはWebサーバーのレスポンスヘッダーにCookie情報を追加して送信します。 66// 実際にCookieが設定されたかは、ブラウザの開発者ツール(Applicationタブなど)で確認してください。 67 68?>
このサンプルコードは、ウェブアプリケーションで安全なCookie(クッキー)を設定するためのPHP関数を示しています。初心者の方にもわかりやすいように、セキュリティを考慮したCookieの生成方法を解説しています。
setSecureCookieWithSameSite関数は、指定されたCookie名($name)、Cookieの値($value)、そして有効期限を秒数($expireInSeconds)で受け取ります。この関数は、Cookieの設定を行うため、特定の値を戻り値として返しません。
特に重要なのはSameSite属性です。これは、Cookieが異なるサイトからのリクエストと一緒に送信されるのを制御し、クロスサイトリクエストフォージェリ(CSRF)と呼ばれるウェブ攻撃を防ぐ役割があります。コードでは'Lax'に設定されており、これは推奨されるデフォルト値の一つで、適切なセキュリティとユーザビリティのバランスを提供します。また、secure属性をtrueにすることでHTTPS接続時のみCookieを送信させ、httponly属性をtrueにすることでJavaScriptからのアクセスを禁止し、クロスサイトスクリプティング(XSS)攻撃への対策も強化しています。
Cookieの有効期限はUNIXタイムスタンプで指定しますが、DateTime::COOKIE定数はHTTP Cookieのexpires属性で用いられる特定の日付フォーマット(RFC 822形式)を示す文字列です。この定数自体は直接setcookie関数の有効期限オプションに渡すものではなく、DateTimeオブジェクトのformatメソッドと組み合わせて、指定のフォーマットで日付を表示する際に利用されます。これにより、安全かつ効果的にユーザーの情報を管理できます。
DateTime::COOKIE定数は日付のフォーマット指定文字列であり、setcookie関数のexpiresオプションには、有効期限のUNIXタイムスタンプを指定する必要があります。この定数を直接expiresに渡すとCookieは正しく設定されませんのでご注意ください。また、setcookieはHTTPヘッダーを送信するため、この関数を呼び出す前にHTMLなどの出力があるとエラーが発生します。Cookieを実際に設定し機能させるには、Webサーバー経由でスクリプトを実行し、ブラウザからアクセスすることが必須です。設定後はブラウザの開発者ツールで確認してください。secure、httponly、samesite='Lax'などのオプションは、クロスサイトスクリプティング(XSS)やクロスサイトリクエストフォージェリ(CSRF)といった攻撃からCookieを守るために非常に重要であり、本番環境では必ず利用してください。特にsecure=trueはHTTPS接続が必須です。
PHPクッキー有効期限のフォーマット表示
1<?php 2 3/** 4 * クッキーの有効期限を設定し、そのフォーマット例を表示する関数。 5 * 6 * DateTime::COOKIE 定数は、HTTPヘッダの Expires フィールドに適した、 7 * クッキーの有効期限を示す日時フォーマット文字列を提供します。 8 * setcookie() 関数自体は有効期限をUnixタイムスタンプで受け取りますが、 9 * この定数を使うことで、そのタイムスタンプがどのように文字列として表現されるかを確認できます。 10 * 11 * @param string $cookieName クッキーの名前 12 * @param string $cookieValue クッキーの値 13 * @param int $expireDays 現在から何日後にクッキーの有効期限を設定するか 14 * @return void 15 */ 16function setAndDisplayCookieExpiration(string $cookieName, string $cookieValue, int $expireDays = 7): void 17{ 18 // 現在時刻から指定された日数を加算して有効期限の日時を設定します。 19 $expirationDateTime = new DateTime(); 20 $expirationDateTime->modify("+$expireDays days"); 21 22 // setcookie() 関数を使ってクッキーを設定します。 23 // 'expires' オプションにはUnixタイムスタンプ(1970年1月1日 00:00:00 UTCからの秒数)を指定します。 24 // PHPは内部でこのタイムスタンプをDateTime::COOKIEが表すようなHTTP標準の文字列形式に変換し、 25 // Set-Cookie ヘッダの Expires 属性として送信します。 26 setcookie( 27 $cookieName, 28 $cookieValue, 29 [ 30 'expires' => $expirationDateTime->getTimestamp(), // Unixタイムスタンプで有効期限を指定 31 'path' => '/', // クッキーが有効なパス(ここではサイト全体) 32 'httponly' => true, // JavaScriptからのクッキーアクセスを禁止し、XSS攻撃のリスクを軽減 33 'samesite' => 'Lax', // CSRF対策。異なるサイトからのリクエストでクッキーを送信するかを制御 34 // 'secure' => true, // HTTPS接続の場合のみクッキーを送信。開発環境ではコメントアウトしても良い 35 ] 36 ); 37 38 echo "クッキー '{$cookieName}' を設定しました。<br>"; 39 echo "値: '{$cookieValue}'<br>"; 40 41 // 設定された有効期限がUnixタイムスタンプでどのような値かを表示します。 42 echo "有効期限 (Unixタイムスタンプ): " . $expirationDateTime->getTimestamp() . "<br>"; 43 44 // DateTime::COOKIE 定数を使用して、設定された有効期限がHTTPヘッダのExpiresフィールドで 45 // どのような形式の文字列になるかを表示します。 46 // この定数は "W, d-M-Y H:i:s T" の形式(例: "Wed, 01-Jan-2025 00:00:00 GMT")です。 47 echo "有効期限 (DateTime::COOKIE フォーマット): " . $expirationDateTime->format(DateTime::COOKIE) . "<br>"; 48 49 // setcookie() はレスポンスヘッダを設定するため、 50 // このスクリプトがブラウザに返されるまでクッキーは設定されません。 51 // そのため、現在のリクエスト内では $_COOKIE 変数に反映されません。 52 echo "<br>このページがブラウザに表示され、次のページリロードまたはアクセス時に、<br>"; 53 echo "ブラウザがクッキーを受け入れていれば '{$cookieName}' クッキーが利用可能になります。<br>"; 54} 55 56// 関数を呼び出してクッキーを設定し、情報を表示します。 57$cookieName = 'my_example_cookie'; 58$cookieValue = 'ThisIsMyCookieValue'; 59$expireDays = 30; // 現在から30日後に有効期限が切れるように設定 60 61setAndDisplayCookieExpiration($cookieName, $cookieValue, $expireDays); 62 63?>
このPHPサンプルコードは、Webブラウザに情報を保存するクッキーを設定し、その有効期限を異なる形式で表示する方法を、システムエンジニアを目指す初心者の方にも分かりやすく説明しています。
setAndDisplayCookieExpiration関数は、$cookieNameというクッキーの名前、$cookieValueというクッキーの値、そして$expireDaysで指定された日数後に有効期限が切れるようにクッキーを設定します。この関数は何も値を返しません(void)。
コード内で特に重要なのがDateTime::COOKIE定数です。この定数は、HTTPヘッダのExpiresフィールドで利用される、「W, d-M-Y H:i:s T」のような標準的な日時フォーマット文字列を提供します。setcookie()関数は、有効期限を1970年1月1日からの秒数で表される「Unixタイムスタンプ」として受け取ります。しかし、DateTimeオブジェクトのformat()メソッドにDateTime::COOKIE定数を指定することで、このUnixタイムスタンプがHTTPヘッダでどのような文字列形式(例: "Wed, 01-Jan-2025 00:00:00 GMT")として表現されるかを確認できます。
サンプルコードでは、現在時刻から$expireDays日後の日時を計算し、そのUnixタイムスタンプをsetcookie()関数のexpiresオプションに渡してクッキーを設定しています。httponlyやsamesiteといった、セキュリティを高めるためのオプションも同時に設定しています。setcookie()はWebサーバーからの応答ヘッダとしてクッキー情報を送信するため、このスクリプトがブラウザに表示されるまではクッキーは設定されず、$_COOKIE変数にもすぐには反映されません。次のページアクセス時にブラウザがクッキーを受け入れていれば利用可能になります。
setcookie()関数でクッキーの有効期限を設定する際は、DateTime::COOKIE定数を直接渡すのではなく、DateTimeオブジェクトのgetTimestamp()メソッドで得られるUnixタイムスタンプを指定してください。DateTime::COOKIEはHTTPヘッダでの有効期限の文字列フォーマットを示す定数です。
クッキーを設定するsetcookie()関数は、HTML出力より前に呼び出す必要があります。また、設定したクッキーは同じリクエストの$_COOKIE変数には反映されず、次のリクエストから利用可能になります。
セキュリティ対策として、httponlyをtrueに設定し、JavaScriptからのアクセスを防ぎましょう。また、samesite属性(例:Lax)を設定し、CSRF対策を行うことも重要です。本番環境ではHTTPS接続を前提にsecureをtrueに設定し、クッキーの盗聴リスクを軽減してください。