欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP實(shí)現(xiàn)提高SESSION響應(yīng)速度的幾種方法詳解

 更新時(shí)間:2019年08月09日 11:43:25   作者:koastal  
這篇文章主要介紹了PHP實(shí)現(xiàn)提高SESSION響應(yīng)速度的幾種方法,結(jié)合實(shí)例形式分析了php操作session的機(jī)制與提高session響應(yīng)速度的常見操作技巧,需要的朋友可以參考下

本文實(shí)例講述了PHP實(shí)現(xiàn)提高SESSION響應(yīng)速度的幾種方法。分享給大家供大家參考,具體如下:

設(shè)置多級(jí)目錄存儲(chǔ)SESSION

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

session.save_path = "2;/tmp"

將SESSION存儲(chǔ)到redis中

php中的session默認(rèn)是存儲(chǔ)在文件中的,支持redis存儲(chǔ)方式,因?yàn)閞edis的鍵值數(shù)據(jù)時(shí)存儲(chǔ)在內(nèi)存中的,可以提高session的存取速度。

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

及時(shí)釋放SESSION文件鎖

我們?cè)谑褂胹ession時(shí),需要先執(zhí)行session_start()函數(shù)。

session_start()函數(shù)的作用如下:

判斷http請(qǐng)求是否包含名為PHPSESSID的cookie,如果沒有則創(chuàng)建該cookie并寫入到http響應(yīng)的頭文件。

通過PHPSESSID查找對(duì)應(yīng)的session文件,以讀寫方式打開的文件,然后讀取里面的數(shù)據(jù)到內(nèi)存。

然后我們一般會(huì)通過$_SESSION這個(gè)超全局變量,讀取或者設(shè)置session的值,我們操作的時(shí)候,session的值都是保存在內(nèi)存中的,默認(rèn)在頁面執(zhí)行完畢之后,才會(huì)寫入到對(duì)應(yīng)的文件中。

我們通過下面的一段代碼測(cè)試這個(gè)過程:

session執(zhí)行過程分析

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

輸出結(jié)果

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

通過上面的例子可以發(fā)現(xiàn),在頁面執(zhí)行的過程中(頁面的執(zhí)行過程是指將php文件解析為對(duì)應(yīng)的html文件的耗時(shí),而不是用戶在該頁面上的停留時(shí)間),session文件是被鎖定的。

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

session死鎖示例程序

upload.php

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

index.php

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

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

session_commit過程分析

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

輸出結(jié)果

open
read
write
close

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

shutdown

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

死鎖示例優(yōu)化后程序

upload.php

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

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

執(zhí)行完session_commit之后

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

session_commit的另一個(gè)名字是session_write_close,也就是將session信息寫入并關(guān)閉文件的意思。session_commit之后,雖然session文件已經(jīng)關(guān)閉,但是頁面還在執(zhí)行,只要沒有執(zhí)行session_unset內(nèi)存中就還保存著session的值,所以我們還可以獲取和輸出session的值。其實(shí),這個(gè)時(shí)候我們還可以給session賦值,但是這個(gè)賦值只是賦值到內(nèi)存中,因?yàn)槲募呀?jīng)關(guān)閉,所以其他頁面時(shí)訪問不到session_commit();之后設(shè)置的session的值。

銷毀session

既然已經(jīng)探討了這么多session的問題了,那么我們?cè)谡f一下用戶注銷時(shí),銷毀session的操作。

通過上面的分析,我們知道session的值會(huì)保存在內(nèi)存和文件兩個(gè)地方。
session_start()會(huì)將對(duì)應(yīng)文件打開,并將session數(shù)據(jù)讀入到內(nèi)存。
session_commit()會(huì)將內(nèi)存中的session數(shù)據(jù)寫入到文件中,并關(guān)閉文件。
不顯示調(diào)用session_commit()的話,會(huì)在頁面執(zhí)行完畢之后,自動(dòng)調(diào)用。

所以,我們需要?jiǎng)h除內(nèi)存中的session信息,并且刪除session文件。

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

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

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

注銷登錄完整代碼

logout.php

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

附錄

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 />";
}

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php緩存技術(shù)總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP錯(cuò)誤與異常處理方法總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 解決FastCGI 進(jìn)程超過了配置的活動(dòng)超時(shí)時(shí)限的問題

    解決FastCGI 進(jìn)程超過了配置的活動(dòng)超時(shí)時(shí)限的問題

    本篇文章是對(duì)解決FastCGI 進(jìn)程超過了配置的活動(dòng)超時(shí)時(shí)限的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • PHP pthreads v3在centos7平臺(tái)下的安裝與配置操作方法

    PHP pthreads v3在centos7平臺(tái)下的安裝與配置操作方法

    這篇文章主要介紹了PHP pthreads v3在centos7平臺(tái)下的安裝與配置操作方法,結(jié)合圖文與實(shí)例形式分析了PHP pthreads v3在centos7平臺(tái)下的安裝與配置操作具體步驟、相關(guān)命令與注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • ThinkPHP php 框架學(xué)習(xí)筆記

    ThinkPHP php 框架學(xué)習(xí)筆記

    花了兩個(gè)多鐘在看 ThinkPHP 框架,不想太過深入的知道它的所有高深理論。單純想知道怎么可以用起來,可以快捷的搭建一個(gè)網(wǎng)站。所以是有選擇的看,二個(gè)鐘后還是一頭霧水。于是決定改變學(xué)習(xí)策略,上官方論壇看其它高人寫的民間教程,果然比官方的通俗易懂多了。
    2009-10-10
  • php繪圖之生成餅狀圖的方法

    php繪圖之生成餅狀圖的方法

    這篇文章主要介紹了php繪圖之生成餅狀圖的方法,涉及GD庫中imagefilledarc方法的使用技巧,需要的朋友可以參考下
    2015-01-01
  • PHP開發(fā)規(guī)范手冊(cè)之PHP代碼規(guī)范詳解

    PHP開發(fā)規(guī)范手冊(cè)之PHP代碼規(guī)范詳解

    對(duì)于PHP入門學(xué)習(xí)的童鞋來說,了解PHP開發(fā)規(guī)范可以少走很多彎路,網(wǎng)上各種PHP開發(fā)規(guī)范也很多,我結(jié)合自身使用PHP的情況,來說說我所理解的PHP開發(fā)規(guī)范。
    2011-01-01
  • php PDO中文亂碼解決辦法

    php PDO中文亂碼解決辦法

    PDO 類, 發(fā)現(xiàn)也會(huì)有 UTF-8 亂碼問題, 以下解決方案
    2009-07-07
  • php中函數(shù)前加&符號(hào)的作用分解

    php中函數(shù)前加&符號(hào)的作用分解

    這篇文章主要介紹了php中的函數(shù)前加&符號(hào)的作用分解,其作用叫做引用返回,有點(diǎn)抽象,詳細(xì)解釋請(qǐng)看本文內(nèi)容,需要的朋友可以參考下
    2014-07-07
  • 一文詳解PHP連接MySQL數(shù)據(jù)庫的三種方式

    一文詳解PHP連接MySQL數(shù)據(jù)庫的三種方式

    PHP與MySQL的連接有三種API接口,分別是:PHP的MySQL擴(kuò)展 、PHP的mysqli擴(kuò)展 、PHP數(shù)據(jù)對(duì)象(PDO)。本文將詳解這三種方式的示例代碼,需要的可以參考一下
    2022-05-05
  • gearman管理工具GearmanManager的安裝與php使用方法示例

    gearman管理工具GearmanManager的安裝與php使用方法示例

    這篇文章主要介紹了gearman管理工具GearmanManager的安裝與php使用方法,結(jié)合實(shí)例形式詳細(xì)分析了gearman管理工具GearmanManager的安裝及php使用GearmanManager相關(guān)配置與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • PHP實(shí)現(xiàn)預(yù)定義鉤子和自定義鉤子的簡(jiǎn)單示例

    PHP實(shí)現(xiàn)預(yù)定義鉤子和自定義鉤子的簡(jiǎn)單示例

    這篇文章主要給大家介紹了PHP實(shí)現(xiàn)預(yù)定義鉤子和自定義鉤子,在PHP中,鉤子(Hooks)是一種機(jī)制,允許開發(fā)人員在特定的時(shí)機(jī)插入自定義代碼,通過使用鉤子,開發(fā)人員可以在應(yīng)用程序的特定事件發(fā)生時(shí)執(zhí)行自定義的功能或邏輯,文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2023-11-11

最新評(píng)論