亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

php session的鎖和并發

2024-05-04 23:42:28
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了php session的鎖和并發,與之相關的現象有請求阻塞、session數據丟失、session數據讀不到的問題,感興趣的小伙伴們可以參考一下
 

本文分享PHP的session在使用過程中的鎖和并發的問題,與之相關的現象有請求阻塞、session數據丟失、session數據讀不到。

我登錄不了了
某天,我準備登錄我們一個后臺系統,前去解決一個bug,在賬戶密碼驗證碼都準確輸入的情況下,我登錄不上,經過多次實驗發現主要有兩個錯誤信息:

  • csrf驗證失敗
  • 驗證碼錯誤【我對碼神起誓我用半角輸入了我看到的驗證碼,且順序一致,無多加字符】

我們的系統
我們的系統是基于phalcon 2.0.8 開發的,如你所見,我們在表單域加入了防止csrf攻擊的域。也啟用了驗證碼。

<input type="hidden"   name="{{ security.getTokenKey() }}"  value="{{ security.getToken() }}"/><img src="/login/getCaptcha" id="img-captcha"/> 

我首先對這兩個組件進行查閱,發現他們都是將數據存于session:

# phalcon/security.zep# Security::getToken()let session = <SessionInterface> dependencyInjector->getShared("session"); session->set(this->_tokenValueSessionID, token); $this->session->set('admin_get_captcha_action', $captcha);

然后我又查閱了我們session的實現,發現是將數據存儲于redis的。

找啊找
什么問題導致我登錄不上呢?既然是數據驗證上出現問題,就從數據著手吧,我登陸我們測試環境的redis機器,執行 redis-cli monitor,然后走一遍登錄流程,發現輸出如下(意思意思):

  • GET sessionId  
  • GET sessionId  
  • SETEX sessionId 3600 csrf=xxxx  
  • SETEX sessionId 3600 captcha=abcd  

我們可以看到:

1、這里存在兩次請求,一次是表單加載,一次是生成驗證碼的。
2、存在“并發”的情況,這兩個請求應該是表單加載渲染后才請求驗證碼的,也就是session順序應該是get->set->get->set,看起來怎么是并發請求了。
3、后面那個SETEX沒有csrf的內容,也就是覆蓋掉前面的數據了
整個世界都不好了,不過也稍微明白是什么問題了。什么問題呢,說來話長,要從PHP的session數據的存取說起。

php的session數據的存取
session的數據是經過編碼成字符串存儲在存儲器【file、db、redis、memcache等】的,在我們使用session的時候,是什么時候去儲存器取數據的?又是什么時候將數據寫入存儲器的?

這個問題的答案可能和一些朋友想的不一樣,一個請求里面,PHP只會讀取一次存儲器,在session_start的時候,然后也只會寫入一次存儲器,在請求結束的時候,或調用session_write_close的時候,將數據刷回存儲器,關閉session。

那么問題來了:

1、如果一個會話,同時出現兩個讀寫session請求,沒有保證獲取1-寫入1-獲取2-寫入2,同時沒有cas版本管理機制的情況下,這些并發請求就會彼此讀取不到對方的寫入,最后寫入的會把前面請求寫入的session覆蓋掉。
2、如果請求是串行的,像登錄頁面的表單和驗證碼,也有可能前面的請求已經輸出內容了,但是session還沒寫入,后面的請求就已經發起了。
鎖與不鎖
解決這種資源的并發一般會通過鎖或版本管理來處理。但是版本管理我看不到好的方法。就聊聊鎖吧。

其實鎖是不大適合,有弊端的。

php的session,默認是用文件存儲的,在打開session的時候,會對文件加獨占鎖,這樣,其它請求就無法獲取鎖了,只能等待直到前面的鎖解了。

這樣保證了 讀取-寫入,讀取-寫入的順序。

其它存儲器,例如mysql,可以借助select for update進行行鎖。redis可以通過一個自增鍵,返回1的獲取到鎖等來實現。

這個實現的話,對數據流來說很理想,但是,對于目前這種頁面大量應用ajax的情況,所有請求排隊處理,將大大加大頁面展現的耗時,甚至出現請求超時等不可用故障。

沒有解決的解決
不建議過多使用session,其一次讀取一次寫入的機制所引發的問題,會造成坑的存在。
在模版渲染前,或請求輸出前調用session_write_close

# 立刻回寫session,避免session覆蓋$eventManager = $this->view->getEventsManager();if (!$eventManager) {   $eventManager = new Manager();  $this->view->setEventsManager($eventManager);}$eventManager->attach("view:afterRender",function(){  session_write_close();});return $this->view; 
if($login) {   # 立刻回寫session,避免session讀取不到  $eventManager = $this->dispatcher->getEventsManager();  if (!$eventManager) {    $eventManager = new Manager();    $this->dispatcher->setEventsManager($eventManager);  }  $eventManager->attach('dispatch:afterDispatchLoop',function(){    session_write_close();  });  return $this->response->setHeader('Location', '/');}

以上就是關于php session的鎖和并發,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩在线一区| 久久久久久高潮国产精品视| 在线播放国产一区二区三区| 亚洲国产日韩欧美综合久久| 亚洲影院色在线观看免费| 国产精品久久97| 久久久久久尹人网香蕉| 成人精品一区二区三区| 欧美不卡视频一区发布| 中文字幕国产精品| 亚洲天堂免费在线| 成人免费观看网址| 日韩精品免费一线在线观看| 欧美黑人狂野猛交老妇| 国产精品视频男人的天堂| 中国china体内裑精亚洲片| 国产精品国产自产拍高清av水多| 亚洲最大福利网| 亚洲小视频在线| 97色伦亚洲国产| 国产精品久久久| 亚洲人成电影在线观看天堂色| 欧美电影免费播放| 中文字幕日韩在线播放| 好吊成人免视频| 亚洲欧洲激情在线| 日韩av免费在线| 欧美日韩综合视频| 亚洲欧美国内爽妇网| 欧美综合国产精品久久丁香| 亚洲欧美制服综合另类| 91精品国产综合久久香蕉922| 亚洲色图欧美制服丝袜另类第一页| 久久精品国产清自在天天线| 91精品国产777在线观看| 国产精品成人av性教育| 热99久久精品| 久久综合免费视频影院| 黄色一区二区在线| 日韩有码在线观看| 国产丝袜一区二区三区免费视频| 国产91免费看片| 亚洲一区第一页| 久久亚洲电影天堂| yellow中文字幕久久| 成人免费视频在线观看超级碰| 亚洲天堂视频在线观看| 日韩在线观看免费av| 福利微拍一区二区| 亚洲r级在线观看| 精品国产一区二区三区四区在线观看| 国产91网红主播在线观看| 亚洲偷欧美偷国内偷| 日韩成人在线视频观看| 亚洲午夜精品视频| 欧美大尺度激情区在线播放| 久久精品亚洲热| 国产一区二区香蕉| 91久久久久久久久久久久久| 国产日韩中文字幕在线| 丝袜亚洲欧美日韩综合| 欧美激情精品久久久久久黑人| 81精品国产乱码久久久久久| 国产精品福利网| 一本大道亚洲视频| 国产精品一二三视频| 国产suv精品一区二区三区88区| 国产精品久久久久久久久免费| 精品亚洲永久免费精品| 中文字幕av日韩| 亚洲一区二区三区四区在线播放| 日韩电影大全免费观看2023年上| 日本中文字幕久久看| 欧美日韩裸体免费视频| 国产精品久久久久久久美男| 亚洲免费视频在线观看| 色哟哟入口国产精品| 免费不卡欧美自拍视频| 69精品小视频| 日韩欧亚中文在线| 久久国产精彩视频| 亚洲午夜未删减在线观看| 国产精品爽黄69| 亚洲欧洲激情在线| 91精品免费视频| 国产精品日韩欧美综合| 国产精品99久久久久久人| 浅井舞香一区二区| 亚洲美女黄色片| 日韩视频中文字幕| 伊人成人开心激情综合网| 蜜臀久久99精品久久久久久宅男| 国产精品户外野外| 456国产精品| 亚洲欧洲视频在线| 97久久精品在线| 欧美性极品xxxx做受| 国产丝袜高跟一区| 国产精品久久久久久久久久免费| 欧美最顶级的aⅴ艳星| 免费av一区二区| 亚洲激情在线观看| 欧美国产精品日韩| 国产精品稀缺呦系列在线| 国产视频精品自拍| 另类少妇人与禽zozz0性伦| 欧美自拍视频在线| 日本国产精品视频| 狠狠干狠狠久久| 亚州av一区二区| 北条麻妃一区二区在线观看| 国产精品嫩草影院久久久| 欧美午夜视频在线观看| 国产精品免费视频xxxx| 亚洲人成电影网站色www| 国产不卡在线观看| 欧美日韩在线免费| 久久亚洲综合国产精品99麻豆精品福利| 51午夜精品视频| 欧美美女操人视频| 精品国产一区二区三区久久| 色综合老司机第九色激情| 色777狠狠综合秋免鲁丝| 日韩国产精品一区| 日韩一级黄色av| 亚洲天堂av在线免费| 91久久久亚洲精品| 久久精品亚洲一区| 欧美日韩福利电影| 中文字幕av一区中文字幕天堂| 欧美精品精品精品精品免费| 国产精品96久久久久久又黄又硬| 国产精品91在线观看| 韩剧1988在线观看免费完整版| 国产精品欧美久久久| 成人免费网站在线看| 欧美日韩国产123| 九九精品视频在线观看| 国产一区二区三区免费视频| 57pao国产成人免费| 97久久伊人激情网| 国产精品69久久久久| 日本一区二区三区在线播放| 久久夜色精品国产| 久久亚洲精品小早川怜子66| 亚洲国产精彩中文乱码av| 欧美精品aaa| 久久久久国产视频| 九色精品免费永久在线| 日本精品久久久久久久| 欧美日韩国产成人在线观看| 国产精品九九九| 日韩大片在线观看视频| 亚洲精品资源在线| 久久综合国产精品台湾中文娱乐网| 欧美视频一二三| 成人妇女淫片aaaa视频| 精品久久久久久中文字幕| 成人动漫网站在线观看| 91精品在线一区| 久久久久女教师免费一区| 亚洲理论电影网| 韩国视频理论视频久久| 美女av一区二区|