解決session阻塞問題的辦法:在session操作完成後呼叫session_write_close()即可避免此問題;
案例一:
使用session過程中,在開啟session後,同一瀏覽器,執行同一程式,不同頁面會被鎖。不同瀏覽器不會出現這種情況。
疑問:是不是session_start導致了阻塞?
於是,我寫了幾個頁面測試了一下,發現是session導致了阻www.cppcns.com塞,而其他兩種情況不會造成阻塞。
查了下php的bug列表,發現有人提出了這個問題:
複製** **如下:
description:
------------
calling session_start() appears to wait until other scripts h**e exited
that are using the same session. my guess is the 1st request locks the
session file for exclusive use, and the second requestdqerq blocks until it
can open it.
php官方的回覆是:
複製** **如下:
thank you for taking the time to write to us, but this is not a bug.this is expected, the session file is locked to **oid corruption.
程式設計客棧; 結合了php的session機制,找到了阻塞的原因。由於php的session資訊是寫入檔案的,1個客戶端占有1個session檔案。因此,當 session_start被呼叫的時候,該檔案是被鎖住的,而且是以讀寫模式鎖住的(因為程式中可能要修改session的值),這樣,第2次呼叫 session_start的時候就被阻塞了。
最簡解決方法:
查了php的手冊,發現乙個session_write_close函式,作用是write session data and end session,也就是寫session的資料,同時關閉這個session。因此,我們可以在用完session之後,呼叫這個函式關閉session 檔案即可解除鎖定。一般,session是用來記錄使用者身份資訊的,以便php進行身份認證,因此完全可以將session的讀寫放在頁面剛開始執行的時 候,在執行完以後,馬上呼叫函式即可。
案例二:
上回說要改opencart其實是給opencart加乙個抓取**上的產品的功能,但是弄完後發現乙個問題,就是當指令碼在抓取的時候,因為這個過程比較慢,這個時候其他所有指令碼的執行都被阻塞了,直到抓取完其他指令碼才能依次執行。研究了半天沒有結果,在知乎上問了下可能是session的問題,需要呼叫session_write_close()來解決,那麼這個session_write_close()是幹嘛用的呢,手冊上這樣寫的:
複製** **如下:
結束當前session,儲存session資料。
session資料通常會在指令碼執行結束後被儲存而並不需要呼叫session_write_close(),但是為保護session在任何時候都只能被乙個指令碼執行寫操作,session的資料會被鎖住。當同時使用框架網頁和session時你會發現,框架裡的網頁會因為這個個鎖定而逐個載入。你可以通過在所有的session資料修改儲存結束後馬上結束session來加快載入時間。
這就很好的解釋了為什麼我的抓取指令碼會阻塞其他頁面的原因。所以,如果你有乙個需要執行時間比較長並用到session的ajax請求的話,就需要在伺服器端呼叫session_write_close(),不然你的其他頁面就都會被掛起直到請求結束!!!
本文標題: php中session引起的指令碼阻塞問題解決辦法
本文位址:
php中的session技術
1.開啟session session start 2.設定session session失效時間是會話結束後 session username user1 session user id 15 3.刪除session 1.開啟sessionsession start 2.清空session陣列 s...
Session引起的備份失效處理
上週月底檢測各個系統執行狀態的時候突然發現,檔案伺服器上缺少了幾天erp系統的備份資料,erp系統資料備份是日常工作中非常重要的一項,所以對這個問題進行了分析和處理,在此過程中學到一些新的知識,留此文以備以後查閱。一 故障現象 9.1日檢查檔案伺服器異機備份情況發現,erp系統備份資料只有8.24日...
PHP中session變數的銷毀
1.何為session?2.session變數的銷毀 程式 session unset session destroy session unset 釋放當前在記憶體中已經建立的所有 session變數,但不刪除session檔案以及不釋放對應的session id session destroy 刪...