PHP中Session引起的指令碼阻塞問題解決辦法_php執行個體

來源:互聯網
上載者:User


解決session阻塞問題的辦法:在session操作完成後調用session_write_close()即可避免此問題;


案例一:

使用session過程中,在開啟session後,同一瀏覽器,執行同一程式,不同頁面會被鎖。不同瀏覽器不會出現這種情況。

  疑問:是不是session_start導致了阻塞?

   於是,我寫了幾個頁面測試了一下,發現是session導致了阻塞,而其他兩種情況不會造成阻塞。

   查了下PHP的Bug列表,發現有人提出了這個問題:

複製代碼 代碼如下:
Description:
------------
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官方的回複是:

複製代碼 代碼如下:
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 avoid 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的讀寫放在頁面剛開始執行的時 候,在執行完以後,馬上調用session_write_close函數即可。


案例二:

上回說要改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(),不然你的其他頁面就都會被掛起直到請求結束!!!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.