サーチ…
構文
- 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の名前です。これを使用して、セッションの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
エラーを回避するのに役立ちます。