麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 網站 > 建站經驗 > 正文

淺析PHP中Session可能會引起并發問題

2024-04-25 20:39:50
字體:
來源:轉載
供稿:網友

在進行Web應用程序開發的時候,人們經常會用Session存儲數據。但可能有人不知道,在PHP中,Session使用不當可能會引起并發問題。印度醫療行業軟件解決方案提供商Plus91 Technologies高級工程師Kishan Gor在個人博客上對這個問題進行了闡釋。

如果同一個客戶端并發發送多個請求,而每個請求都使用了Session,那么PHP Session鎖的存在會導致服務器串行響應這些請求,而不是并行。這是因為在默認情況下,PHP使用文件存儲Session數據。對于每一個新的Session,PHP會創建一個文件,并持續向其中寫入數據。所以,每次調用session_start()方法,就會打開Session文件,并取得文件的獨占鎖。這樣,如果服務器腳本正在處理一個請求,而客戶端又發送了一個同樣需要使用Session的請求,那么后一個請求會阻塞,直至前一個請求處理完成釋放了文件上的獨占鎖。不過,這只限于來自同一個客戶端的多個請求,也就是說,來自一個客戶端的請求并不會阻塞另一個客戶端的請求。

如果腳本很短,這通常沒有問題。但如果腳本運行時間比較長,那就可能會產生問題。在現代Web應用程序開發中,有一個非常常見的情況,就是使用AJAX技術在同一個頁面內發送多個請求獲取數據。如果這些請求都需要使用Session,那么第一個請求到達服務器后會取得Session鎖,其它請求就必須等待,所有請求將串行處理,即使它們彼此之間并沒有依賴關系。這將大大增加頁面的響應時間。

有一個方法可以避免這個問題,就是在使用完Session以后立即調用session_write_close()方法關閉Session。這樣Session鎖就會釋放,即使當前腳本還在等在處理。需要注意的是,調用該方法后,當前腳本就不能進一步操作Session了。

需要特別指出的是,本文所陳述的問題和觀點只適用于使用session_start()方法的PHP默認Session管理模式。比如,有用戶就指出,如果將應用程序托管在AWS EC2上,并正確配置DynamoDB,Session鎖定問題就不會出現。

附上一份實例代碼:

Session.php

<?php

final class SessionController extends YafController_Abstract

{

public function setUserFileAction()

{

session_start();

$_SESSION['user_name'] = 'xudianyang';

$_SESSION['user_id'] = '123';

sleep(3);

echo json_encode($_SESSION);

return false;

}

public function setLoginFileAction()

{

session_start();

$_SESSION['last_time'] = time();

echo json_encode($_SESSION);

return false;

}

public function indexFileAction()

{

// Auto Rend View

}

public function getSessionFileAction()

{

session_start();

var_dump($_SESSION);

return false;

}

public function setUserRedisAction()

{

$session = CoreFactory::session();

$session->set('user_name', 'xudianyang');

$session->set('user_id', '123');

sleep(3);

echo json_encode($_SESSION);

return false;

}

public function setLoginRedisAction()

{

$session = CoreFactory::session();

$session->set('last_time', time());

echo json_encode($_SESSION);

return false;

}

public function indexRedisAction()

{

// Auto Rend View

}

public function getSessionRedisAction()

{

$session = CoreFactory::session();

var_dump($_SESSION);

return false;
}

}

indexfile.phtml

<!DOCTYPE html>

<html>

<head>

<title>測試session并發鎖問題</title>

<meta charset="utf-8">

<script type="text/javascript" src="/assets/js/jquery-1.10.2.min.js"></script>

<script type="text/javascript">

$.ajax({

url: "/session/setUserFile",

type: "get",

dataType: "json",

success: function(response){

console.info(response.last_time);

}

});

setTimeout(function(){

$.ajax({

url: "/session/setLoginFile",

type: "get",

dataType: "json",

success: function(response){

console.info(response.last_time);

}

});

}, 300);

</script>

</head>

<body>

同時發起2兩個ajax請求

</body>

</html>

indexredis.phtml

<!DOCTYPE html>

<html>

<head>

<title>測試session并發鎖問題</title>

<meta charset="utf-8">

<script type="text/javascript" src="/assets/js/jquery-1.10.2.min.js"></script>

<script type="text/javascript">

$.ajax({

url: "/session/setUserRedis",

type: "get",

dataType: "json",

success: function(response){

console.info(response.last_time);

}

});

setTimeout(function(){

$.ajax({

url: "/session/setLoginRedis",

type: "get",

dataType: "json",

success: function(response){

console.info(response.last_time);

}

});

}, 300);

</script>

</head>

<body>

同時發起2兩個ajax請求

</body>

</html>

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美人与zoxxxx另类9 | 深夜福利久久久 | 欧美精品欧美极品欧美激情 | 在线观看麻豆 | 春光影院理论片 | 国产亚洲精品久久久久婷婷瑜伽 | 国产精品毛片无码 | 国产va在线观看免费 | 99国产精品白浆在线观看免费 | 国产免费一区二区三区 | 中文在线观看免费视频 | 成人综合免费视频 | 日本看片一区二区三区高清 | 久久久久久久亚洲精品 | 成人一区久久 | 欧美成人精品欧美一级 | 热99精品视频 | 欧美xxxxx视频 | 久久视讯 | 国产精品一区二区视频 | 伊人yinren22综合网色 | 一级做受毛片免费大片 | 又黄又爽免费无遮挡在线观看 | 羞羞视频免费网站男男 | www.狠狠操.com| 国产乱淫av片免费观看 | 免费在线观看毛片 | 一级做受毛片免费大片 | 美女羞羞视频在线观看 | 免费福利在线视频 | 九草在线视频 | 91精品国产综合久久久欧美 | 91短视频在线观看视频 | 九九热九九热 | 中国女人内谢69xxxx天美 | 国内精品久久久久久久影视红豆 | 日韩黄在线 | 亚洲精品成人18久久久久 | 亚洲视频在线视频 | 欧美精品成人一区二区在线观看 | 精国产品一区二区三区四季综 |