PHP的session檔案獨佔鎖引起阻塞的隱患及解決方案

來源:互聯網
上載者:User

在PHP中,P預設的會話處理器是session.save_handler = files(即檔案)。如果同一個用戶端同時並發發送多個請求(如ajax在頁面同時發送多個請求),且指令碼執行時間較長,就會導致session檔案阻塞,影響效能。因為對於每個請求,PHP執行session_start(),就會取得檔案獨佔鎖,只有在該請求處理結束後,才會釋放獨佔鎖。這樣,同時多個請求就會引起阻塞。解決方案如下:

(1)修改會話變數後,立即使用session_write_close()來儲存會話資料並釋放檔案鎖。

session_start(); $_SESSION['test'] = 'test';session_write_close(); //do something



(2)利用session_set_save_handler()函數是實現自訂會話處理。

function open($savePath, $sessionName){    echo 'open is called';    return true;} function close(){    echo 'close is called';    return true;} function read($sessionId){    echo 'read is called';    return '';} function write($sessionId, $data){    echo 'write is called';    return true;} function destroy($sessionId){    echo 'destroy is called';    return true;} function gc($lifetime){    echo 'gc is called';    return true;} session_set_save_handler("open", "close", "read", "write", "destroy", "gc");register_shutdown_function ( 'session_write_close' ); session_start(); $_SESSION['foo'] = "bar";



當然,在 php 5.4.0之後,你可以通過實現 SessionHandlerInterface 介面或繼承 SessionHandler 類來使用。

class MySessionHandler extends SessionHandler  {     public function __construct()    {    }     public function open($save_path, $session_id)    {    }     public function close()    {     }     public function create_sid()    {    }     public function read($id)    {    }     public function write($id, $data)    {    }     public function destroy($id)    {    }} $handler = new MySessionHandler();

 
//第2個參數將函數 session_write_close()  註冊為 register_shutdown_function()  函數。
session_set_save_handler($handler, true);


你可以對上面的代碼進行具體實現和封裝,利用mysql或其它記憶體資料庫來管理會話資料。還能解決使用叢集時,session資料共用問題。

對於這個php內建的隱患,相信官方過一段時間會有很好的解決辦法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.