ここでの他の回答は、かなり良い解決策を示しています。@Jon が述べたように、秘訣は、変更を加える前に session_start() を再度呼び出すことです。次に、変更が完了したら、session_write_close() を再度呼び出します。
@Armel Larcier が述べたように、これに関する問題は、PHP が新しいヘッダーを生成しようとし、警告を生成する可能性があることです (たとえば、ヘッダー以外のデータを既にクライアントに書き込んでいる場合)。もちろん、session_start() の前に「@」を付けることもできますが (@session_start())、もっと良い方法があります。
@VolkerK によって提供された別のスタック オーバーフローの質問は、最良の答えを明らかにします。
session_start(); // first session_start
...
session_write_close();
...
ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
//ini_set('session.use_trans_sid', false); //May be necessary in some situations
ini_set('session.cache_limiter', null);
session_start(); // second session_start
これにより、PHP がヘッダーを再度送信しようとするのを防ぎます。これをもう少し便利にするために、ini_set() 関数をラップするヘルパー関数を作成することもできます。
function session_reopen() {
ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
//ini_set('session.use_trans_sid', false); //May be necessary in some situations
ini_set('session.cache_limiter', null);
session_start(); //Reopen the (previously closed) session for writing.
}
元の関連 SO 質問/回答: https://stackoverflow.com/a/12315542/114558