サーチ…


構文

  • void session_abort(void)
  • int session_cache_expire([string $ new_cache_expire])
  • void session_commit(void)
  • string session_create_id([string $ prefix])
  • bool session_decode(文字列$ data)
  • bool session_destroy(void)
  • 文字列session_encode(void)
  • int session_gc(void)
  • 配列session_get_cookie_params(void)
  • string session_id([string $ id])
  • bool session_is_registered(文字列$ name)
  • string session_module_name([string $ module])
  • string session_name([string $ name])
  • bool session_regenerate_id([bool $ delete_old_session = false])
  • void session_register_shutdown(void)
  • bool session_register(mixed $ name [、mixed $ ...])
  • void session_reset(void)
  • string session_save_path([string $ path])
  • void session_set_cookie_params(int $ lifetime [、string $ path [、string $ domain [、bool $ secure = false [、bool $ httponly = false]]]])
  • bool session_set_save_handler(callable $ open、callable $ close、callable $ read、callable $ write、callable $ destroy、callable $ gc [、callable $ create_sid [、callable $ validate_sid、callable $ update_timestamp]])
  • bool session_start([array $ options = []])
  • int session_status(void)
  • bool session_unregister(文字列$ name)
  • void session_unset(void)
  • void session_write_close(void)

備考

セッションがすでに開始されていてもsession_start()を呼び出すと、PHPの警告が表示されることに注意してください。

セッションデータの操作

$_SESSION変数は配列であり、通常の配列のように取得または操作できます。

<?php
// Starting the session
session_start();

// Storing the value in session
$_SESSION['id'] = 342;

// conditional usage of session values that may have been set in a previous session
if(!isset($_SESSION["login"])) {
    echo "Please login first";
    exit;
}
// now you can use the login safely
$user = $_SESSION["login"];

// Getting a value from the session data, or with default value, 
//     using the Null Coalescing operator in PHP 7
$name = $_SESSION['name'] ?? 'Anonymous';

配列の操作方法の詳細は、「配列の操作 」を参照してください。

セッションにオブジェクトを格納すると、クラスオートローダーがある場合、またはクラスをすでにロードしている場合にのみ、オブジェクトを正常に取得できます。それ以外の場合、オブジェクトは__PHP_Incomplete_Class型として出力され、後でクラッシュする可能性があります。オートローディングについては名前空間とオートローディング」を参照してください。

警告:

セッションデータはハイジャックされる可能性があります。 Pro PHPセキュリティ:アプリケーションセキュリティ原則からXSS Defenseの実装まで - 第7章:セッションハイジャックの防止 $_SESSION個人情報を保存しないことを強く推奨します。これには、 クレジットカード番号政府発行のID 、およびパスワードが最も批判的に含ま ます 。ハッカーが正当なユーザーを偽装/妥協することを可能にする名前電子メール電話番号などのデータをあまり想定していないデータにも拡張されます。原則として、セッションデータには、数値識別子などの無価値/非個人的な値を使用します。

セッション全体を破壊する

あなたが破壊したいセッションを持っているなら、 session_destroy()これを行うことができます。

/*
    Let us assume that our session looks like this:
    Array([firstname] => Jon, [id] => 123)

    We first need to start our session:
*/
session_start();

/*
    We can now remove all the values from the `SESSION` superglobal:
    If you omitted this step all of the global variables stored in the 
    superglobal would still exist even though the session had been destroyed.
*/
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

//Finally we can destroy the session:
session_destroy();

session_destroy()を使うことは、 $_SESSION = array();ようなものを使うこととは異なり$_SESSION = array(); SESSIONスーパーグローバルに格納されているすべての値が削除されますが、実際に格納されているセッションのバージョンは破棄されません。


注意$_SESSION = array();を使用し$_SESSION = array(); マニュアルでは以下のように規定されているため session_unset()

$ _SESSIONを使用しない古い非推奨コードに対しては、session_unset()のみを使用してください。

session_start()オプション

PHPセッションから、 セッションベースのphp.iniオプションを持つ配列をsession_start関数に渡すことができます。

<?php
   if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
       // php >= 7 version
       session_start([
          'cache_limiter' => 'private',
          'read_and_close' => true,
       ]);
   } else {
       // php < 7 version
       session_start();
   }
?>

この機能では、 session.lazy_writeという名前の新しいphp.ini設定も導入されています。これはデフォルトでtrueなり、セッションデータが変更された場合にのみ書き換えられます。

参照先: https : //wiki.php.net/rfc/session-lock-ini

セッション名

セッション名は、セッションを保存するために使用されるCookieの名前です。これを使用して、セッションのCookieがユーザー用に作成されているかどうかを検出できます。

if(isset($_COOKIE[session_name()])) {
    session_start();
}

クッキーを不必要に作成したくないのでない限り、この方法は一般的に有用ではないことに注意してください。

セッション名の変更

session_name()呼び出して、セッション名を更新できます。

//Set the session name
session_name('newname');
//Start the session
session_start();

session_name()引数が指定されていない場合は、現在のセッション名が返されます。

英数字のみを使用する必要があります。それは短く記述的でなければならない(すなわち、有効にされたクッキー警告を持つユーザのために)。セッション名は数字のみで構成することはできません。少なくとも1文字は必須です。そうしないと、毎回新しいセッションIDが生成されます。

セッションロック

PHPがセッションデータをサーバー側のファイルに書き込むことは、皆知っているからです。 session_start()を介してセッションを開始するPHPスクリプトを要求すると、PHPはこのsessionファイルをロックし、同じsession_idに対する他の着信リクエストをブロック/待機させます。これにより、他のリクエストはsession_start()またはロックされセッションファイルが解放さない限り

スクリプトが完了するかセッションが手動で終了するまで、セッションファイルはロックされたままです。このような状況、 つまり複数のリクエストがブロックされないようにするために 、セッションを開始し、セッションを閉じてセッションファイルからロックを解除し、残りのリクエストを続けることができます。

// php < 7.0 
// start session 
session_start();

// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked

// close the session, release lock
session_write_close();

セッションが閉じられても、セッションがまだ利用可能である場合でも、セッション値がどのように読み取られ、どのように美しくなるかは今考えられます。だから、私たちはまだセッションデータを読むことができます。

echo $_SESSION['id'];    // will output  123

php> = 7.0では、 read_onlyセッション、 read_writeセッション、 lazy_writeセッションを持つことができるので、 session_write_close()を使用する必要はありません。

エラーのない安​​全なセッションの開始

多くの開発者は、巨大なプロジェクトで作業する場合、特にプラグイン、アドオン、コンポーネントなどのモジュール化されたCMSで動作する場合、この問題を抱えています。安全なセッション開始のためのソリューションここでは、セッションが開始された場合セッションが存在しない場合、私は安全なセッションを開始します。セッションが存在する場合、何も起こりません。

if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    if(session_status() == PHP_SESSION_NONE) {
        session_start(array(
          'cache_limiter' => 'private',
          'read_and_close' => true,
       ));
    }
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
}
else
{
    if(session_id() == '') {
        session_start();
    }
}

これは、 session_startエラーを回避するのに役立ちます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow