這篇文章主要介紹了PHP session文件獨(dú)占鎖引起阻塞,本文講解PHP使用默認(rèn)文件會(huì)話(huà)處理器時(shí)容易導(dǎo)致的阻塞問(wèn)題解決方法,需要的朋友可以參考下
PHP默認(rèn)的會(huì)話(huà)處理器是session.save_handler = files(即文件)。如果同一個(gè)客戶(hù)端同時(shí)并發(fā)發(fā)送多個(gè)請(qǐng)求(如ajax在頁(yè)面同時(shí)發(fā)送多個(gè)請(qǐng)求),且腳本執(zhí)行時(shí)間較長(zhǎng),就會(huì)導(dǎo)致session文件阻塞,影響性能。因?yàn)閷?duì)于每個(gè)請(qǐng)求,PHP執(zhí)行session_start(),就會(huì)取得文件獨(dú)占鎖,只有在該請(qǐng)求處理結(jié)束后,才會(huì)釋放獨(dú)占鎖。這樣,同時(shí)多個(gè)請(qǐng)求就會(huì)引起阻塞。解決方案如下:
(1)修改會(huì)話(huà)變量后,立即使用session_write_close()來(lái)保存會(huì)話(huà)數(shù)據(jù)并釋放文件鎖。
?
1 2 3 4 5 6 session_start(); $_SESSION['test'] = 'test'; session_write_close(); //do something(2)利用session_set_save_ha
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 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";當(dāng)然,在 php 5.4.0之后,你可以通過(guò)實(shí)現(xiàn) SessionHandlerInterface 接口或繼承 SessionHandler 類(lèi)來(lái)使用。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注