問題描述:
最近在接手公司的一個項目的時候,發現在訪問同一個瀏覽器訪問同一個頁面的時候,當前一個網頁沒有完成的時候,之後的頁面也沒有辦法繼續進行,只有當第一個頁面完成後,第二個頁面纔會繼續;
並且當網絡不好時,如果第一個頁面訪問時間很長,沒有完成時,之前已經打開的頁面也沒有辦法操作;
同時在網頁前臺卡頓的時候,網站的後臺就沒有辦法訪問了,造成的前後臺的互相阻塞現象;
網站情況
網站是php後臺
- php5.6
- pache2.2
- mysql5.5
- 框架thinkphp3.1
- windows (本地)
- linux (遠程)
測試
爲了頁面的執行時間,在程序里加了sleep(10)
後面的頁面執行時間都會大於前面的頁面的執行時間
後面的頁面的完時間都會在前面的頁面的完成時間之後
解決
將所有的sql語句進行排查,代碼排查也沒有發現問題
最後發現在tp框架中默認是開啓session的,之後並沒有關閉
並且在覈心類中的session中只要調用過session()
方法的,就會使用SESSION_START()
之後並沒有進行關閉
所有我的解決方法是在自己寫的基礎控制器中 和調用了session()
方法的地方添加了如下代碼
session_write_close();
//暫時關閉session文件的寫操作
然後測試頁面就不會再出現一個頁面阻塞整個網站的情況了
所在建議session在打開後一定要及時進行關閉
原理
因爲session是存儲在用戶信息的,可以做到全局使用,確實很方便
正常我們自己操作session應該是這樣的
#php原生代碼
<php>
session_start();
$_SESSION['user'] = 'admin';
$_SESSION['pwd'] = '123456';
session_commit();
<?php>
#tp框架
session('user','admin');
在寫入數據的時候,session文件是一定會打開的,但是寫之後一定要關閉,當一個頁面訪問時打開了session文件,只有當頁面結束時纔會關閉文件,然後下個頁面才能繼續來打開這個文件,就好像排隊一樣。所以當我們不用寫入數據時要保證session文件是關閉的,以免造成阻塞。
因爲在php中,session原始數據是保存在session中的,同時又將數據保存了$_SESSION
超全局數組中,所以關閉session後,數據還是可以從$_SESSION
中讀取到的。
SESSION常用操作
session_start() #開啓session,一個頁面只用開啓一次即可
session_cache_expire() #返回當前緩存的到期時間
session_cache_limiter() #讀取/設置緩存限制器
session_commit() #session_write_close() 的別名,提交session,關閉session文件
session_encode() #將當前會話數據編碼爲一個字符串
session_decode() #解碼會話數據
session_destroy() #銷燬一個會話中的全部數據
這就是我這次遇到問題的總結和對session的進一步理解,如果裏有不對的地方,歡迎大家指正。