[英]PHP SESSION handling - invalid values
我們需要在許多現有代碼中使用session_write_close()。 但這對我們來說似乎很危險,因為PHP會執行以下操作-而不給出任何警告或錯誤:
session_name('goodoldasdf');
session_start();
if (!empty($_SESSION['var'])) {
print ' Session-Data: '. $_SESSION['var'];
}
$_SESSION['var'] = "before";
session_write_close();
$_SESSION['var'] = "after"; // notice: definition after write close!
print ' B: '. $_SESSION['var'];
當我們在session_write_close之后定義SESSION-var時,PHP不會將SESSION寫入MemcacheD會話處理程序(如預期的那樣)-但它仍在同一腳本運行時內部使用覆蓋。
輸出:“偽會話數據: 之后 ”。
第二輪:
輸出:“會話數據: 在偽會話數據之前:” 之后
問題是: 如何確保PHP沒有使用未實際寫入會話的偽 SESSION-vars? 有沒有辦法在這里獲取PHP警告? 或有任何解決此問題的建議?
為什么我們需要到處添加寫關閉:將“ PHP 5.x”更新為“ PHP 7”后,所有操作都變慢了。 尤其是在AJAX請求或同時加載mutli選項卡上。 這是因為PHP 7似乎改變了它的SESSION處理/阻塞。
很好的演示: https : //demo.ma.ttias.be/demo-php-blocking-sessions/
因此,我們需要將session_write_close添加到許多腳本中-避免冒險使用無效的session-values。
您可以查看session_status()
的輸出( Docs )
switch(session_status()) {
case PHP_SESSION_DISABLED:
die('Sessions disabled on this server');
case PHP_SESSION_NONE:
die('Session has not been started, or has been closed');
case PHP_SESSION_ACTIVE:
die('There is currently an active session');
}
您可以將其與包裝函數一起使用,以獲取/設置會話變量。
代替session_write_close();
編寫自己的函數並取消設置超全局變量:
function session_stop() {
session_write_close();
unset($_SESSION);
}
現在您將獲得:
注意:文件X行Y中的未定義變量:_SESSION
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.