20

ヘッダーにすでに警告が送信されていない状態でPHPでセッションを再開するにはどうすればよいですか?

設定したいすべてのセッション変数を設定した後、session_write_close()でセッションを閉じます。これを行うのは、セッションが開いている限り、同じクライアントからのアクティブな接続は1つだけである可能性があるためです。しかし、私は複数の並列のものを持っているのが好きです。

ただし、後で別のセッション変数を設定したい場合は、session_start()を使用してセッションをもう一度開く必要があります。これは機能しますが、すでにクライアントにコードを送信しているため、「ヘッダーは既に送信されています」という警告が出力されます。なぜCookieを再設定しようとしているのですか?クッキーはすでに設定されています。必要なのは、サーバーにセッションファイルを再度書き込むためのアクセス権を取得することだけです。

まあ、私はそれらを抑制することができます。しかし、Cookieヘッダーを再送信せずにsession_write_closeで閉じられたセッションを再開する方法はありますか?Cookieヘッダーは、最初のsession_start()によってすでに正しく送信されています。したがって、2つ目は、Webサーバーに保存されているセッションファイルへの書き込みへのアクセスを許可する必要があります。

<?php
session_start();
// setting all the session vars I like to set
session_write_close(); // <-- // To allow parallel requests by the same user, while this script is still running

// Code that takes some time to execute
// It also prints output, so no more cookie headers after this point

@session_start(); // <-- works, but I like to use it without suppressing warnings
$_SESSION['key'] = 'new value I like to store';
session_write_close();
?>
4

2 に答える 2

25
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);
ini_set('session.cache_limiter', null);
session_start(); // second session_start

これにより、phpが2回目に呼び出すのを防ぐことができphp_session_send_cookie()ます。
それが機能しているのを見てください

スクリプトを再構築することはまだより良いオプションのようですが...


PHP 7.2以降の場合、エラーや警告を回避するために、基本的にセッションCookieを再実装する必要があります。

ini_set('session.use_only_cookies', false);
ini_set('session.use_cookies', false);
ini_set('session.use_trans_sid', false);
ini_set('session.cache_limiter', null);

if(array_key_exists('PHPSESSID', $_COOKIE))
    session_id($_COOKIE['PHPSESSID']);
else {
    session_start();
    setcookie('PHPSESSID', session_id());
    session_write_close();
}

session_start();
...
session_write_close();
...

session_start(); // second session_start
于 2012-09-07T09:37:39.240 に答える
6

編集@VolkerKのソリューションを参照してください。これよりも優れています。

スクリプトの実行中にスクリプトの出力をバッファリングして、ヘッダーが送信されないようにし、最後に出力します。

<?php

  session_start();
  // setting all the session vars I like to set
  session_write_close();

  // Start output buffer
  ob_start();

  // Code that takes some time to execute

  // Do session stuff at the end of the script
  session_start();
  $_SESSION['key'] = 'new value I like to store';
  session_write_close();

  // Send output to client
  ob_end_flush();

参照:出力制御機能

于 2012-09-07T09:22:43.480 に答える