簡體   English   中英

我應該在何時何地使用session_start?

[英]When and where should I use session_start?

究竟應該在何時何地在PHP中使用session_start()

例如,假設我有一個登錄腳本,該腳本設置了一個會話變量以告知用戶是否已登錄。然后必須將session_start()放在腳本的頂部,還是僅在實際設置會話變量之前登錄是否成功?

<?php
// session_start(); here?

if (login($username, $password)) {
    // session_start(); or here?

    $_SESSION["username"] = $username;
}
?>

根據w3schools的說法,另一種情況是

注意: session_start()函數必須是文檔中的第一件事。 在任何HTML標記之前。

除非您啟用了輸出緩沖,否則session_start() 必須在將標頭以外的任何內容發送到瀏覽器之前進行(因為它在標頭中設置了cookie)。

必須在您嘗試引用$ _SESSION數據之前出現。

在您的示例中,在任何一個實例之前都沒有html標記輸出-因此兩者都可以工作。

打開會話會有一定的成本,因此,如果您要對請求進行其他基於非會話的驗證,則將session_start()推遲到這些檢查通過后才能使您更靈活地抵御DOS攻擊。

正如其他人所說,您必須做的絕對要求是:

  • 在讀取或寫入$_SESSION之前,必須運行session_start (否則它將只是一個普通數組,不會保存在任何地方)。
  • 除非您使用session_write_close將其關閉,否則在一個腳本執行(頁面加載)期間,您不得運行session_start兩次。

還有一條額外的規則,從技術上講有例外,但最好將其視為絕對的:

  • 在編寫任何輸出( echo ,PHP塊外的HTML等)之后,請勿啟動會話,因為如果服務器已經開始發送內容,則PHP可能無法將cookie發送到瀏覽器。

您可能要避免啟動會話有兩個原因:

  • PHP在打開會話時將其鎖定,以避免兩個進程將有沖突的數據寫入會話,因此,如果一次有多個請求發生,則除非它們確實需要,否則請避免它們彼此等待。 例如,如果您正在響應AJAX請求,並且不需要會話中的任何數據,請不要打開它。
  • 正如symcbean所提到的,創建新會話需要一定的成本,因此,如果您的站點正忙於合法或惡意流量,則可能需要提供一些登錄頁面或錯誤消息而根本不啟動它。

在那之后,這成為樣式和體系結構的問題,但是涵蓋以上大部分內容的經驗法則是“如果確定頁面需要,請盡快”。

在大多數情況下,在頁面頂部開始會話是最好的。 但是,如果您不需要整個文檔/代碼的會話,則可以始終將其放置在if()子句之后,如本例所示。

session_start()函數可以在代碼中的任何位置。 您應該將其放置在文檔的開頭以保持一致性,並稱之為一天。 如果您有單獨的數據庫或配置文件,則包含在所有登錄/數據庫驅動的頁面中,則應將其放在其中,這樣就不必將其重新編碼為每個頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM