2017-08-24 47 views
1

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

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

<?php 
// session_start(); here? 

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

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

另一種情況是這樣的,根據W3Schools的

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

+2

至於你的問題,你可以在任何你想要的地方開始會話,但要注意會話__必須在任何輸出之前開始。所以它被認爲是在頁面頂部開始會話的合理方法。 –

+0

在使用任何會話變量之前,您應該開始會話。 –

+0

您也只能調用'session_start()'一次。多次調用會產生錯誤。 – Mike

回答

2

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

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

有,在技術上有例外的額外的規則,但絕對是最好的治療:

  • 你寫的任何輸出(echo,HTML PHP之外的塊等)後,不要啓動會話,因爲如果服務器已經開始發送內容,PHP可能無法發送cookie到瀏覽器。

有兩方面的原因,你可能想避免啓動會話:

  • PHP鎖定會話,當你打開它,以避免兩個進程寫入矛盾的數據進去,所以如果你有幾個請求一次發生,你想避免他們等待對方,除非他們真的需要。例如,如果您正在響應AJAX請求,並且不需要會話中的任何數據,請不要打開它。
  • 正如symcbean所述,創建新會話需要花費一些成本,因此,如果您的網站忙於合法或惡意流量,則可能需要爲某些着陸頁或錯誤消息提供服務,而無需啓動它。

之後,它變成了風格和體系結構的問題,但涵蓋大部分上述內容的經驗法則是「儘快,如果您確定頁面需要它」。

0

在頁面頂部開始會話大部分時間是最好的。但是,如果您不需要整個文檔/代碼的會話,則可以將其放在if()子句之後,如本例中所示。

+0

用另外的想法編輯了這個問題 – super

2

除非您啓用了輸出緩衝,否則在標題發送到瀏覽器之前(因爲它在標頭中設置cookie)之前,session_start()必須爲

必須來嘗試引用$ _SESSION數據之前。

在你的例子中,在兩個實例之前沒有輸出html標籤 - 所以兩者都可以工作。

打開一個會話需要花費一些成本,所以如果您要對請求進行額外的基於非會話的驗證,那麼推遲session_start()直到這些檢查通過,確實會提高您對DOS攻擊的抵禦能力。

0

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