Detaillierte Erläuterung häufig verwendeter Funktionen in Session in PHP

小云云
Freigeben: 2023-03-22 12:46:02
Original
2357 Leute haben es durchsucht

session_start() erstellt eine neue Sitzung oder verwendet eine vorhandene Sitzung wieder. Wenn eine Sitzungs-ID per GET oder POST oder mithilfe eines Cookies übermittelt wird, wird die bestehende Sitzung wiederverwendet.

Wenn eine Sitzung automatisch oder manuell über session_start() startet, ruft PHP intern die Open- und Read-Callback-Funktionen des Sitzungsmanagers auf. Der Sitzungsmanager kann der PHP-Standard sein oder von einer Erweiterung (SQLite- oder Memcached-Erweiterung) bereitgestellt werden oder es kann ein benutzerdefinierter Sitzungsmanager sein, der über session_set_save_handler() festgelegt wird. Wenn vorhandene Sitzungsdaten (in einem speziellen Serialisierungsformat gespeichert) von der Leserückruffunktion zurückgegeben werden, deserialisiert PHP die Daten automatisch und füllt die superglobale Variable $_SESSION.

Um benannte Sitzungen zu verwenden, rufen Sie die Funktion session_name() auf, bevor Sie die Funktion session_start() aufrufen.
Wenn die Option session.use_trans_sid aktiviert ist, registriert die Funktion session_start() einen internen Ausgabemanager, der das Umschreiben von URLs durchführt.

Hinweis: Um Cookie-basierte Sitzungen zu verwenden, muss die Funktion session_start() aufgerufen werden, bevor die Ausgabe beginnt.

session_unset()

Zerstöre die aktuellen Sitzungsdaten. Oder $_SESSION = array(); Wenn Sie einzelne Sitzungsdaten zerstören möchten, können Sie unset ($_SESSION['varname']);.

session_destroy()

verwenden, um session_unset() alle Sitzungsdaten zu zerstören session_destroy() die Sitzung zu zerstören sich selbst. Sobald die Funktion beendet wird, wird die aktuelle Sitzung zu Müll und wartet darauf, dass der GC-Mechanismus sie recycelt. Allerdings werden weder die mit der aktuellen Sitzung verknüpften globalen Variablen noch das Sitzungscookie zurückgesetzt. Die Sitzungsdaten, die vorhanden sein sollten, sind immer noch vorhanden, aber die „Identität“ hat sich geändert. Wenn gc es noch nicht recycelt hat, kann es trotzdem gelesen werden, was Sie natürlich nicht sehen möchten, daher müssen Sie es oft session_destroy() vorher session_unset() tun.

Wenn Sie die Sitzungsvariable erneut verwenden müssen, müssen Sie die Funktion session_start() erneut aufrufen. Um die Sitzung vollständig zu zerstören, beispielsweise beim Abmelden des Benutzers, muss auch die Sitzungs-ID zurückgesetzt werden. Wenn die Sitzungs-ID über ein Cookie übertragen wird, muss zusätzlich die Funktion setcookie() aufgerufen werden, um das Sitzungscookie des Clients zu löschen.

Die folgenden Beispiele dienen dazu, die Daten selbst zu zerstören:

// 初始化会话。// 如果要使用会话,别忘了现在就调用:session_start();// 重置会话中的所有变量,销毁会话数据$_SESSION = array(); // 或者session_unset() // 如果要清理的更彻底,那么同时删除会话 cookie// 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身if (ini_get("session.use_cookies")) {    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,        $params["path"], $params["domain"],        $params["secure"], $params["httponly"]
    );
}// 最后,销毁会话session_destroy();
Nach dem Login kopieren
Nach dem Login kopieren

Sitzungsdaten zerstören$_SESSION = array() oder session_unset(); die Sitzung selbst zerstörensession_destroy() und setcookie(); session_destroy()Nach der Ausführung wird die Sitzung zu einer Garbage-Sitzung und wartet auf das Recycling durch den GC-Mechanismus.

session_commit()

session_commit() ist ein Alias ​​für session_write_close(). Im Gegensatz zu session_start ist dies das Schreiben von und das Schließen von . Das heißt, speichern Sie die aktuellen Sitzungsdaten und schließen Sie die aktuelle Sitzung. Um das gleichzeitige Schreiben einer Sitzung zu verhindern, darf jeweils nur ein PHP-Skript die Sitzung ausführen. Daher kann, sobald ein Skript session_start die Sitzung öffnet, kein anderes Skript verwendet werden, bis das Skript beendet wird oder session_write_close() ist Sitzung aufgerufen. Standardmäßig wird die Sitzung automatisch geschrieben und geschlossen, wenn das Skript endet. Wenn die Skriptausführungszeit jedoch relativ lang ist, belegt das Skript ständig die Sperre, sodass andere Skripte die Sitzung nicht verwenden können, was zu vielen Fehlern führt. Daher besteht die beste Vorgehensweise darin, dass Sie, wenn sich Sitzungsvariablen oder Daten ändern (z. B. $_SESSION[xx] = xxx), session_commit() verwenden müssen, um die Daten zu speichern und die Sitzung rechtzeitig zu schließen.

session_id ()

session_id() kann verwendet werden, um die aktuelle Sitzungs-ID abzurufen/einzustellen. Um eine Sitzungs-ID einfach an eine URL anzuhängen, können Sie die konstante SID verwenden, um den Sitzungsnamen und die Sitzungs-ID im Zeichenfolgenformat abzurufen. Einfach ausgedrückt: Wenn Sie die POST/GET-Methode aktivieren, um die Sitzungs-ID zu erhalten, kann dieser Parameter über session.use_trans_sid festgelegt und in der URL sichtbar sein und kann direkt über die globale Variable SID im Skript abgerufen werden.

//配置ini_set('session.use_trans_sid', 'sid');//url中表现127.0.0.1?sid=xxxxx//直接获取$sid = SID;
Nach dem Login kopieren

Wenn der Wert des Parameters session_id () angegeben ist, verwenden Sie den angegebenen Wert als Sitzungs-ID. Die session_start()-Funktion muss aufgerufen werden, bevor die session_id()-Funktion aufgerufen wird. Verschiedene Sitzungsmanager haben unterschiedliche Einschränkungen hinsichtlich der Zeichen, die in Sitzungs-IDs verwendet werden können. Wenn keine aktuelle Sitzung vorhanden ist, wird eine leere Zeichenfolge ("") zurückgegeben.

Hier sind zwei Punkte zu beachten:

  • Wenn ein Cookie zur Übertragung der Sitzungs-ID verwendet wird und der ID-Parameter angegeben ist, wird der Client an gesendet Der Client sendet nach dem Aufruf von session_start() ein neues Cookie, unabhängig davon, ob die aktuelle Sitzungs-ID und die neu angegebene Sitzungs-ID identisch sind

  • Bevor die aktuelle Sitzungs-ID über session_id ($ id), muss geschlossen werden session_commit() Die vorherige Sitzung, andernfalls ist die aktuelle Sitzung immer noch das Original

Weitere Funktionen finden Sie auf der offiziellen PHP-Website oder im Handbuch.

我们在前面的文章里面讲到session的原理和最佳实践,感到意犹未尽。现在再来聊下PHP Session用到的几个相关的函数。

session_start()

session_start() 会创建新会话或者重用现有会话。 如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。

当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会调用会话管理器的 open 和 read 回调函数。 会话管理器可能是 PHP 默认的, 也可能是扩展提供的(SQLite 或者 Memcached 扩展), 也可能是通过 session_set_save_handler() 设定的用户自定义会话管理器。 通过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP 会自动反序列化数据并且填充 $_SESSION 超级全局变量。

要想使用命名会话,请在调用 session_start() 函数 之前调用 session_name() 函数。
如果启用了 session.use_trans_sid 选项, session_start() 函数会注册一个内部输出管理器, 该输出管理器完成 URL 重写的工作。

注意:要使用基于 cookie 的会话, 必须在输出开始之前调用 session_start() 函数。

session_unset()

销毁当前会话数据。或者$_SESSION = array(); 如果要销毁个别会话数据,可以unset ($_SESSION['varname']);.

session_destroy()

session_unset()销毁所有会话数据不同,session_destroy()销毁的是会话本身,此函数一出,当前session就变成垃圾了,等待gc机制去回收它。但是它并不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。该有的会话数据还是在,只不过“身份”变了而已。如果gc尚且还没有去回收它,那么它仍然是可以读取到的,这当然是不愿意看到的,因此在session_destroy() 之前往往还要session_unset()一下。

如果需要再次使用会话变量, 必须重新调用 session_start() 函数。 为了彻底销毁会话,比如在用户退出登录的时候,必须同时重置会话 ID。 如果是通过 cookie 方式传送会话 ID 的,那么同时也需要 调用 setcookie() 函数来 删除客户端的会话 cookie。

下面例子是销毁数据本身:

// 初始化会话。// 如果要使用会话,别忘了现在就调用:session_start();// 重置会话中的所有变量,销毁会话数据$_SESSION = array(); // 或者session_unset() // 如果要清理的更彻底,那么同时删除会话 cookie// 注意:这样不但销毁了会话中的数据,还同时销毁了会话本身if (ini_get("session.use_cookies")) {    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,        $params["path"], $params["domain"],        $params["secure"], $params["httponly"]
    );
}// 最后,销毁会话session_destroy();
Nach dem Login kopieren
Nach dem Login kopieren

销毁会话数据$_SESSION = array()session_unset() ;销毁会话本身session_destroy();和setcookie()session_destroy()执行后会话就变成垃圾会话,等待gc机制回收。

session_commit()

session_commit()session_write_close()别称。和session_start相反,这是关闭。即保存当前session数据,并且关闭当前会话。为了防止并发的写session,任何时刻只能允许有一个PHP脚本在操作session,因此,一个脚本一旦session_start打开session,那么在此脚本终止或者调用session_write_close()之前,别的任何脚本都不能使用session。在默认情况下脚本结束时会自动写入和关闭session,但是在脚本执行时间比较长的时候,此脚本就一致占据锁使得别的脚本无法使用session,因此导致许多错误。因此,最佳实践是,任何session变量,数据的更改(如$_SESSION[xx] = xxx),都要及时使用session_commit()保存数据,关闭会话。

session_id ()

session_id() 可以用来获取/设置 当前会话 ID。 为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量 SID 获取以字符串格式表达的会话名称和 ID。简单说,就是如果你开启的是POST/GET方式获取会话ID,那么这个参数可以通过session.use_trans_sid设定并在URL中看得见,而在脚本中通过全局变量SID来直接获取。

//配置ini_set('session.use_trans_sid', 'sid');//url中表现127.0.0.1?sid=xxxxx//直接获取$sid = SID;
Nach dem Login kopieren

如果指定了 session_id () 参数的值, 则使用指定值作为会话 ID。 必须在调用 session_start() 函数之前调用 session_id() 函数。不同的会话管理器对于会话 ID 中可以使用的字符有不同的限制。  如果当前没有会话,则返回空字符串(”“)。

这里有两点值得注意下:

  • 如果使用 cookie 方式传送会话 ID,并且指定了 id 参数, 在调用 session_start() 之后都会向客户端发送新的 cookie, 无论当前的会话 ID 和新指定的会话 ID 是否相同

  • Bevor Sie die aktuelle Sitzungs-ID über session_id ($id) ändern, müssen Sie die vorherige Sitzung über session_commit() schließen, andernfalls bleibt die aktuelle Sitzung die ursprüngliche Sitzung

Weitere Funktionen finden Sie auf der offiziellen PHP-Website oder im Handbuch.

Verwandte Empfehlungen:

Detaillierte Erläuterung der gemeinsam genutzten Redis-Sitzung

Detaillierte Erläuterung der Sitzungssperre, Parallelität und Abdeckung in PHP

PHP-Änderungssitzungs-Überlebensspeicher-Zeitcode-Sharing

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung häufig verwendeter Funktionen in Session in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!