PHP中Session引起的腳本阻塞問題解決辦法
解決session阻塞問題的辦法:在session操作完成后調(diào)用session_write_close()即可避免此問題;
案例一:
使用session過程中,在開啟session后,同一瀏覽器,執(zhí)行同一程序,不同頁面會(huì)被鎖。不同瀏覽器不會(huì)出現(xiàn)這種情況。
疑問:是不是session_start導(dǎo)致了阻塞?
于是,我寫了幾個(gè)頁面測(cè)試了一下,發(fā)現(xiàn)是session導(dǎo)致了阻塞,而其他兩種情況不會(huì)造成阻塞。
查了下PHP的Bug列表,發(fā)現(xiàn)有人提出了這個(gè)問題:
------------
Calling session_start() appears to wait until other scripts have exited
that are using the same session. My guess is the 1st request locks the
session file for exclusive use, and the second request blocks until it
can open it.
PHP官方的回復(fù)是:
結(jié)合了PHP的Session機(jī)制,找到了阻塞的原因。由于PHP的Session信息是寫入文件的,1個(gè)客戶端占有1個(gè)session文件。因此,當(dāng) session_start被調(diào)用的時(shí)候,該文件是被鎖住的,而且是以讀寫模式鎖住的(因?yàn)槌绦蛑锌赡芤薷膕ession的值),這樣,第2次調(diào)用 session_start的時(shí)候就被阻塞了。
最簡解決方法:
查了PHP的手冊(cè),發(fā)現(xiàn)一個(gè)session_write_close函數(shù),作用是Write session data and end session,也就是寫session的數(shù)據(jù),同時(shí)關(guān)閉這個(gè)session。因此,我們可以在用完session之后,調(diào)用這個(gè)函數(shù)關(guān)閉session 文件即可解除鎖定。一般,session是用來記錄用戶身份信息的,以便PHP進(jìn)行身份認(rèn)證,因此完全可以將session的讀寫放在頁面剛開始執(zhí)行的時(shí) 候,在執(zhí)行完以后,馬上調(diào)用session_write_close函數(shù)即可。
案例二:
上回說要改opencart其實(shí)是給opencart加一個(gè)抓取淘寶上的產(chǎn)品的功能,但是弄完后發(fā)現(xiàn)一個(gè)問題,就是當(dāng)腳本在抓取的時(shí)候,因?yàn)檫@個(gè)過程比較慢,這個(gè)時(shí)候其他所有腳本的執(zhí)行都被阻塞了,直到抓取完其他腳本才能依次執(zhí)行。研究了半天沒有結(jié)果,在知乎上問了下可能是session的問題,需要調(diào)用session_write_close()來解決,那么這個(gè)session_write_close()是干嘛用的呢,手冊(cè)上這樣寫的:
結(jié)束當(dāng)前session,保存session數(shù)據(jù)。
session數(shù)據(jù)通常會(huì)在腳本執(zhí)行結(jié)束后被保存而并不需要調(diào)用session_write_close(),但是為保護(hù)session在任何時(shí)候都只能被一個(gè)腳本執(zhí)行寫操作,session的數(shù)據(jù)會(huì)被鎖住。當(dāng)同時(shí)使用框架網(wǎng)頁和session時(shí)你會(huì)發(fā)現(xiàn),框架里的網(wǎng)頁會(huì)因?yàn)檫@個(gè)個(gè)鎖定而逐個(gè)載入。你可以通過在所有的session數(shù)據(jù)修改保存結(jié)束后馬上結(jié)束session來加快載入時(shí)間。
這就很好的解釋了為什么我的抓取腳本會(huì)阻塞其他頁面的原因。所以,如果你有一個(gè)需要執(zhí)行時(shí)間比較長并用到session的ajax請(qǐng)求的話,就需要在服務(wù)器端調(diào)用session_write_close(),不然你的其他頁面就都會(huì)被掛起直到請(qǐng)求結(jié)束?。。?/P>
- PHP編程中的Session阻塞問題與解決方法分析
- PHP session文件獨(dú)占鎖引起阻塞問題解決方法
- php session的鎖和并發(fā)
- PHP 解決session死鎖的方法
- php中實(shí)現(xiàn)精確設(shè)置session過期時(shí)間的方法
- PHP中session變量的銷毀
- PHP中怎樣保持SESSION不過期 原理及方案介紹
- PHP中session使用方法詳解
- php中session_id()函數(shù)詳細(xì)介紹,會(huì)話id生成過程及session id長度
- php session應(yīng)用實(shí)例 登錄驗(yàn)證
- PHP會(huì)話控制:Session與Cookie詳解
- php基于session鎖防止阻塞請(qǐng)求的方法分析
相關(guān)文章
Symfony2框架學(xué)習(xí)筆記之表單用法詳解
這篇文章主要介紹了Symfony2框架學(xué)習(xí)筆記之表單用法,結(jié)合實(shí)例形式詳細(xì)分析了Symfony2針對(duì)表單的創(chuàng)建,校驗(yàn),提交等各種常用技巧,需要的朋友可以參考下2016-03-03Laravel5.1 框架數(shù)據(jù)庫操作DB運(yùn)行原生SQL的方法分析
這篇文章主要介紹了Laravel5.1 框架數(shù)據(jù)庫操作DB運(yùn)行原生SQL的方法,結(jié)合實(shí)例形式分析了laravel5.1使用DB運(yùn)行原生SQL的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-01-01實(shí)現(xiàn)laravel 插入操作日志到數(shù)據(jù)庫的方法
今天小編就為大家分享一篇實(shí)現(xiàn)laravel 插入操作日志到數(shù)據(jù)庫的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10php中smarty實(shí)現(xiàn)多模版網(wǎng)站的方法
這篇文章主要介紹了php中smarty實(shí)現(xiàn)多模版網(wǎng)站的方法,可實(shí)現(xiàn)smarty動(dòng)態(tài)選擇模板的功能,需要的朋友可以參考下2015-06-06基于PHP代碼實(shí)現(xiàn)中獎(jiǎng)概率算法可用于刮刮卡、大轉(zhuǎn)盤等抽獎(jiǎng)算法
大轉(zhuǎn)盤中獎(jiǎng)概率算法在我們的日常生活中,經(jīng)常遇到,那么基于php代碼是如何實(shí)現(xiàn)中獎(jiǎng)概率算法的,下面通過一段代碼實(shí)例給大家介紹php中獎(jiǎng)概率算法2015-12-12PHP header()函數(shù)使用詳細(xì)(301、404等錯(cuò)誤設(shè)置)
用PHP header()函數(shù)實(shí)現(xiàn)頁面404錯(cuò)誤提示功能,特整理了PHP header()函數(shù)的詳細(xì)使用分享給大家,需要大家多多支持我們2013-04-04微信網(wǎng)頁授權(quán)(OAuth2.0) PHP 源碼簡單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了微信網(wǎng)頁授權(quán)(OAuth2.0) PHP 源碼簡單實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08