首頁  >  文章  >  後端開發  >  php 如何鎖定接口,讓一個接口,同一時間只處理同一人的一次請求?

php 如何鎖定接口,讓一個接口,同一時間只處理同一人的一次請求?

WBOY
WBOY原創
2016-09-05 08:59:552290瀏覽

目前我用的是在session中設定一個值,每次進來判斷這個值是否存在,存在就表示鎖定了,不執行本次請求,如果不存在,就設定這個值,並執行後續操作。

<code>class controller{
    function index(){
        if(isset($_SESSION['lock']))
            return;
            
        $_SESSION['lock'] = 1;
        sleep(1);//这里会查询用户的资格,并给用户发送流量,如果两次同时进来,会造成两次都认为是有资格的,并且会给用户发两次相同流量
        unset($_SESSION['lock']);
    }
}
</code>

我以為這樣做是可以的,而且session存在redis裡速度蠻快,直到剛才睡不著起來擺弄,發現竟然還是能讓一個用戶同時的多次同接口請求都執行了。

想要一個人的同時多次請求,只處理第一個。判斷是否同一人,根據session來判斷。

你們是用什麼方法來保證這個的?

回覆內容:

目前我用的是在session中設定一個值,每次進來判斷這個值是否存在,存在就表示鎖定了,不執行本次請求,如果不存在,就設定這個值,並執行後續操作。

<code>class controller{
    function index(){
        if(isset($_SESSION['lock']))
            return;
            
        $_SESSION['lock'] = 1;
        sleep(1);//这里会查询用户的资格,并给用户发送流量,如果两次同时进来,会造成两次都认为是有资格的,并且会给用户发两次相同流量
        unset($_SESSION['lock']);
    }
}
</code>

我以為這樣做是可以的,而且session存在redis裡速度蠻快,直到剛才睡不著起來擺弄,發現竟然還是能讓一個用戶同時的多次同接口請求都執行了。

想要一個人的同時多次請求,只處理第一個。判斷是否同一人,根據session來判斷。

你們是用什麼方法來保證這個的?

如果涉及到資料庫用加鎖吧,或是把所有的請求弄成隊列一個個的處理吧

我想了想,應該寫入兩個東西,一個是進入時間,退出時間。
存取開始寫入開始時間,退出寫入退出時間。
假設第一次訪問肯定是都是空的,start=02:26:30 end=02:26:50
那麼這樣子我重新發起訪問的時候,判斷一下:
如果start>end,說明在訪問中
這邊還有一種情況,就是訪問發生中斷,來不及寫入end的時間,所以這邊就必須做一個初始化的判斷,比如start>end&&start-end>100直接把end改成當前時間,則空閒,進行訪問
如果start註:時間戳盡量精確到微秒,方便計算。

可以用資料庫來處理啊, 設定一個標識, 使用者進入該請求時先去檢查資料庫, 存在標識不予執行,

使用快取把正在處理的使用者的id存起來,透過過濾器操作id,使用者請求進來過濾器判斷id不在快取則加進來,處理完刪除id。

方法很多,問題是你實際的需求是什麼,希望你能落到最終數據的角度描述下,說不定不從API角度更簡單

從你這個問法來看,你應該是提出了坑爹的解決方案。建議你說出原始需求。

1,如使用Mysql,可以對Mysql進行加鎖,一個請求結束以後,釋放鎖其它請求才能往下執行
2,可以使用計數器,在請求進來的可以往計數器裡加一,請求結束以後清空計數器,較推薦這個方法
3,另外,檔案的session本身是有鎖的,如果同一個使用者的每一次請求未結束,其它請求也會在被阻塞

打完一個文件,然後用文件鎖 操作完成後 文件解鎖 。下個用戶才能繼續訪問 繼續加鎖

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn