婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP實現提高SESSION響應速度的幾種方法詳解

PHP實現提高SESSION響應速度的幾種方法詳解

熱門標簽:仁和怎么申請400開頭的電話 高德地圖標注家 外呼系統撥打暫時無法接通 江西手機自動外呼防封系統是什么 怎么向銷售公司推銷外呼系統 長春人工外呼系統服務商 廣州防封卡外呼系統多少錢一個月 廣東地市地圖標注 哪里辦理400電話

本文實例講述了PHP實現提高SESSION響應速度的幾種方法。分享給大家供大家參考,具體如下:

設置多級目錄存儲SESSION

默認session的存儲目錄是1級目錄,如果用戶量比較大,session文件數量就比較大,我們可以設置目錄數為2,使用2級目錄可以提交查找和存取速度。不過這種方式對速度的提升一般不是很明顯,可以通過修改php.ini,進而修改session存儲目錄數。

session.save_path = "2;/tmp"

將SESSION存儲到redis中

php中的session默認是存儲在文件中的,支持redis存儲方式,因為redis的鍵值數據時存儲在內存中的,可以提高session的存取速度。

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

及時釋放SESSION文件鎖

我們在使用session時,需要先執行session_start()函數。

session_start()函數的作用如下:

判斷http請求是否包含名為PHPSESSID的cookie,如果沒有則創建該cookie并寫入到http響應的頭文件。

通過PHPSESSID查找對應的session文件,以讀寫方式打開的文件,然后讀取里面的數據到內存。

然后我們一般會通過$_SESSION這個超全局變量,讀取或者設置session的值,我們操作的時候,session的值都是保存在內存中的,默認在頁面執行完畢之后,才會寫入到對應的文件中。

我們通過下面的一段代碼測試這個過程:

session執行過程分析

include "session_function.php"; 
//session_function.php代碼在附錄
session_start();
$_SESSION['name']="koastal";
echo "br/>html contentbr/>";
var_dump($_SESSION);
echo "br/>";

輸出結果

open
read
html content
array (size=1)
  'name' => string 'koastal' (length=7)
shutdown
write
close

通過上面的例子可以發現,在頁面執行的過程中(頁面的執行過程是指將php文件解析為對應的html文件的耗時,而不是用戶在該頁面上的停留時間),session文件是被鎖定的。

對于一些耗時的操作,比如文件上傳,發送郵件等,如果用戶在頁面upload.php文件中上傳文件,然后他又打開了個人信息頁面index.php,然而upload.php文件還沒有執行完成,index.php中的session_start()就不能打開對于的session文件,一直等待到upload.php執行完畢。

session死鎖示例程序

upload.php

?php
session_start();
$_SESSION['name']='koastal';
sleep(10); //sleep 10s 模擬文件上傳耗時

index.php

?php
session_start();
var_dump($_SESSION);

通過上面的分析可以知道,session在頁面執行完畢之后,才會寫入到文件中,并釋放文件鎖。session的功能,我們一般都是在頁面中的一部分用到的,當我們處理完session之后,可以使用session_commit()或者session_write_close()函數,提前將session的值寫入到文件中,并釋放文件鎖。

session_commit過程分析

include "session_function.php"; 
//session_function.php代碼在附錄
session_start();
$_SESSION['name']="koastal";
session_commit();
echo "br/>html contentbr/>";
var_dump($_SESSION);
echo "br/>";

輸出結果

open
read
write
close

html content
array (size=1)
  'name' => string 'koastal' (length=7)

shutdown

我們可以看到,在執行了session_commit()之后,就提前將session內容寫到文件中,并且關閉文件(釋放文件鎖)了。

死鎖示例優化后程序

upload.php

?php
session_start();
$_SESSION['name']='koastal';
session_commit();
sleep(10); //sleep 10s 模擬文件上傳耗時

我們操作完session之后,先講session數據寫入到文件,然后再執行上傳過程,就不會影響到其他頁面使用該session文件了。

執行完session_commit之后

?php
session_start();
$_SESSION['name'] = "koastal";
session_commit();
echo $_SESSION['name'];

session_commit的另一個名字是session_write_close,也就是將session信息寫入并關閉文件的意思。session_commit之后,雖然session文件已經關閉,但是頁面還在執行,只要沒有執行session_unset內存中就還保存著session的值,所以我們還可以獲取和輸出session的值。其實,這個時候我們還可以給session賦值,但是這個賦值只是賦值到內存中,因為文件已經關閉,所以其他頁面時訪問不到session_commit();之后設置的session的值。

銷毀session

既然已經探討了這么多session的問題了,那么我們在說一下用戶注銷時,銷毀session的操作。

通過上面的分析,我們知道session的值會保存在內存和文件兩個地方。
session_start()會將對應文件打開,并將session數據讀入到內存。
session_commit()會將內存中的session數據寫入到文件中,并關閉文件。
不顯示調用session_commit()的話,會在頁面執行完畢之后,自動調用。

所以,我們需要刪除內存中的session信息,并且刪除session文件。

session_unset();  //刪除內存中的session信息
session_destory(); //刪除session文件

如果我們只是用session_unset();也能達到注銷用戶的效果,但是這樣處理時間上是把session的數據設置為空,并且寫入session文件中了,本質上并沒有刪除session文件。

上面的兩部操作,銷毀了服務器上的session值,此外,我們還需要清理保存在客戶端中的cookie,完成真正意義上的注銷操作。

注銷登錄完整代碼

logout.php

?php
session_unset();  //刪除內存中的session信息
session_destory(); //刪除session文件
setcookie('PHPSESSID', null, time()-10);//將cookie值設置為過期

附錄

session_function.php

?php
function open($save_path, $session_name) {
  echo __FUNCTION__,"br/>";
  return (true);
}
function close(){
  echo __FUNCTION__,"br/>";
  return (true);
}
function read($id){
  echo __FUNCTION__,"br/>";
}
function write($id, $sess_data){
  echo __FUNCTION__,"br/>";
  return (true);
}
function destroy($id){
  echo __FUNCTION__,"br />";
  return(true);
}
function gc($maxlifetime){
  echo __FUNCTION__,"br />";
  return true;
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
register_shutdown_function('shutdown');
function shutdown()
{
  echo __FUNCTION__,"br />";
}

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php緩存技術總結》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《PHP錯誤與異常處理方法總結》、《php面向對象程序設計入門教程》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP7創建銷毀session的實例方法
  • PHP 圖像處理與SESSION制作超簡單驗證碼的方法示例
  • PHP 實現超簡單的SESSION與COOKIE登錄驗證功能示例
  • PHP cookie與session會話基本用法實例分析
  • 如何解決PHP獲取不到SESSION信息之一般情況
  • thinkphp 5框架實現登陸,登出及session登陸狀態檢測功能示例
  • PHP基于session.upload_progress 實現文件上傳進度顯示功能詳解
  • 通過代碼實例解析PHP session工作原理

標簽:惠州 湘西 濮陽 廈門 文山 海北 黔東 梅河口

巨人網絡通訊聲明:本文標題《PHP實現提高SESSION響應速度的幾種方法詳解》,本文關鍵詞  PHP,實現,提高,SESSION,響應,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP實現提高SESSION響應速度的幾種方法詳解》相關的同類信息!
  • 本頁收集關于PHP實現提高SESSION響應速度的幾種方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 大化| 肃北| 新竹市| 成安县| 黔江区| 灵武市| 承德县| 循化| 万州区| 甘泉县| 秭归县| 吉林省| 泰和县| 疏附县| 济源市| 辉南县| 芷江| 定远县| 商洛市| 鹿泉市| 石首市| 班戈县| 谢通门县| 诸暨市| 安庆市| 大港区| 右玉县| 阳原县| 美姑县| 泸定县| 伊春市| 彰化市| 钟山县| 孟连| 贺州市| 通城县| 银川市| 原平市| 锦州市| 大同县| 徐汇区|