PHPでは、 Session_cache_limiterを使用して、セッション関連のキャッシングポリシーを制御します。応答ヘッダーのキャッシュ制御フィールドに影響を与えるため、ブラウザとプロキシサーバーのキャッシュページのコンテンツがどのように行われるかを判断します。ただし、プロジェクトにsession_cache_limiterに複数の設定がある場合、キャッシュポリシーの競合を引き起こし、キャッシュの不一致の問題を引き起こし、ページのリアルタイムとユーザーエクスペリエンスに影響を与える可能性があります。
この記事では、 session_cache_limiterの設定に遭遇したときに矛盾をキャッシュしないようにする方法を詳細に説明し、特定のソリューションとサンプルコードを提供します。
session_cache_limiterは、HTTPヘッダーのキャッシュ関連フィールドを制御および設定するPHPセッションモジュールの構成アイテムです。一般的な値は次のとおりです。
NoCache (デフォルト):HTTPヘッダーを設定してキャッシュを防ぎ、すべてのアクセスが最新のデータであることを確認します。
public :キャッシュプロキシをキャッシュしてページをキャッシュできます。
プライベート:ブラウザキャッシュを許可しますが、プロキシキャッシュは許可されていません。
private_no_expire :プライベートに似ていますが、有効期限を送信しません。
現在の要求のキャッシュポリシーは、session_cache_limiter()関数を呼び出すことで動的に変更できます。
複数のコードでsession_cache_limiter()を繰り返し、異なる値を設定します<br> たとえば、特定のコンポーネントがNocacheを設定し、他のコンポーネントが公開されており、2つは対立しています。
サードパーティライブラリまたはフレームワークのデフォルト設定は、ビジネスコード設定と競合する<br> サードパーティライブラリを導入する場合、 session_cache_limiter()もライブラリ内で呼び出されます。これは、プロジェクトコードの設定と矛盾しています。
php.iniのデフォルトの構成は、コードの明示的な呼び出しと競合します
この競合により、一貫性のないHTTPヘッダー情報が発生します。これは、キャッシュポリシーが有効になり、ページキャッシュの例外が有効になっているために現れます。
パッケージグラブツール(Chrome開発者ツールのネットワークパネルなど)を使用して、応答ヘッダー内のキャッシュ関連フィールドを表示できます。
キャッシュ制御
期限切れ
プラグマ
異なるページまたは同じページが複数回要求する場合、応答ヘッダーが一貫していないことがわかった場合、 Session_cache_limiterの設定が競合する可能性があります。
複数の設定を回避するために、プロジェクトの入り口または初期化ファイル( index.phpなど)にsention_cache_limiter()を均一に呼び出します。
<?php
// キャッシュ制限を均一に設定します private,ブラウザのキャッシュを許可しますが、プロキシキャッシュを禁止します
session_cache_limiter('private');
// セッションを開始します
session_start();
?>
プロジェクト内の異なるモジュールがsession_cache_limiter()を呼び出す場合がある場合、繰り返し呼び出しを避けるために、静的変数または定数をマーキングとして使用できます。
<?php
function setSessionCacheLimiterOnce($limiter = 'nocache') {
static $isSet = false;
if (!$isSet) {
session_cache_limiter($limiter);
$isSet = true;
}
}
setSessionCacheLimiterOnce('private');
session_start();
?>
session.cache_limiterをphp.iniまたはコードで無効にして、柔軟性を確保するためにキャッシュヘッダーを自分で設定できます。
<?php
// 無効session自動キャッシュ制限
ini_set('session.cache_limiter', '');
// セッションを開始します
session_start();
// キャッシュヘッダーを手動で設定します
header('Cache-Control: private, max-age=600, must-revalidate');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 600) . ' GMT');
?>
これにより、キャッシュ制御が完全に制御されていることが保証され、 session_cache_limiterへの複数の呼び出しによって引き起こされる競合を回避できます。
<?php
// 关闭自動キャッシュ制限,競合を避けてください
ini_set('session.cache_limiter', '');
// キャッシュヘッダーの統一管理
function setCustomCacheHeaders() {
header('Cache-Control: private, max-age=300, must-revalidate');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 300) . ' GMT');
}
// セッションを開始します
session_start();
// キャッシュヘッダーを設定します
setCustomCacheHeaders();
// ページコンテンツ出力の例
echo '<h1>セッションページへようこそ</h1>';
echo '<p>現在の時刻:' . date('Y-m-d H:i:s') . '</p>';
?>
session_cache_limiterの競合により、キャッシュポリシーが失敗し、キャッシュの矛盾として現れます。
複数の呼び出しを避けるために、プロジェクトの入り口にsession_cache_limiterを設定するのが最善です。
複雑なプロジェクトの場合、PHPの自動キャッシュ制限をオフにし、代わりにキャッシュヘッダーを手動で設定できます。
パケットキャプチャツールを使用して、応答ヘッダーをデバッグし、キャッシュポリシーの例外を迅速に発見します。
合理的にsession_cache_limiterおよびキャッシュヘッダー設定の管理は、PHPアプリケーションの安定した一貫したキャッシュ動作を確保するための鍵です。