訪問網站時後一個頁面被前一個頁面阻塞、後臺頁面阻塞前臺頁面的解決

問題描述:

最近在接手公司的一個項目的時候,發現在訪問同一個瀏覽器訪問同一個頁面的時候,當前一個網頁沒有完成的時候,之後的頁面也沒有辦法繼續進行,只有當第一個頁面完成後,第二個頁面纔會繼續;
並且當網絡不好時,如果第一個頁面訪問時間很長,沒有完成時,之前已經打開的頁面也沒有辦法操作;
同時在網頁前臺卡頓的時候,網站的後臺就沒有辦法訪問了,造成的前後臺的互相阻塞現象;

網站情況

網站是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的進一步理解,如果裏有不對的地方,歡迎大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章