因為一個php檔案要定時處理檔案,時間間隔為幾秒,我怕處理時間太長的話,就會放生並發問題,所以使用了flock對檔案加鎖,並且是非阻塞的,這樣後一個請求在前一個沒處理完之前會直接退出,但使用了flock函數的效果跟我預期的不一樣.
index.php 檔案如下:
當我在瀏覽器中兩個視窗同時訪問這個檔案,預期結果是第一個視窗會在5秒後顯示"get lock success",第二個視窗會立即顯示"get lock fail",因為是我設定了LOCK_NB非阻塞.但結果確不是這樣,後訪問的視窗的請求還是會被阻塞,在5秒後才會響應獲得鎖成功,但當我給第二個視窗的url後加上一個參數比如index.php?r=xxxx,第一個url還是index.php,這個時候第二個視窗的請求是非阻塞的.之後我又用兩個不同的瀏覽器,一個Firefox一個chrome瀏覽器同時訪問,結果也是非阻塞的.所以對flock的正確用法產生了疑惑,希望能有人幫我解釋一下這個flock的正確用法,謝謝
回複內容:
因為一個php檔案要定時處理檔案,時間間隔為幾秒,我怕處理時間太長的話,就會放生並發問題,所以使用了flock對檔案加鎖,並且是非阻塞的,這樣後一個請求在前一個沒處理完之前會直接退出,但使用了flock函數的效果跟我預期的不一樣.
index.php 檔案如下:
當我在瀏覽器中兩個視窗同時訪問這個檔案,預期結果是第一個視窗會在5秒後顯示"get lock success",第二個視窗會立即顯示"get lock fail",因為是我設定了LOCK_NB非阻塞.但結果確不是這樣,後訪問的視窗的請求還是會被阻塞,在5秒後才會響應獲得鎖成功,但當我給第二個視窗的url後加上一個參數比如index.php?r=xxxx,第一個url還是index.php,這個時候第二個視窗的請求是非阻塞的.之後我又用兩個不同的瀏覽器,一個Firefox一個chrome瀏覽器同時訪問,結果也是非阻塞的.所以對flock的正確用法產生了疑惑,希望能有人幫我解釋一下這個flock的正確用法,謝謝
建議使用資料庫來管理鎖。
瀏覽器的原因 看看這個 https://lordong.net/wp/post/1337.html