php阻塞模式與非阻塞模式


首先說一下概念,有很多人不理解這個概念。如果看完后還是一頭霧水就多讀幾次。

阻塞與非阻塞

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.

阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。

 

1.php並發阻塞。

  對於php來說並發是個問題,工作中經常會碰到一些,寫庫之前的查詢,判斷數據是否存在,但是如果並發的情況下,就會導致數據重復寫入,而你的判斷也成了虛設。所以有了阻塞,我們需要把請求一條一條的執行。

簡單介紹:
1.首先,讀寫方式打開或者創建文件lock.txt文件
2.給lock.txt文件上 "獨占鎖",上鎖成功后就可以進行下一步"處理訂單商品數據了"
3.處理完數據后,要"釋放鎖”,以及fclose關閉打開的文件
注意:給文件“獨占鎖”后,如果再沒有里面的“釋放鎖”,會出現非常卡的情況

fopen詳細介紹:http://www.w3school.com.cn/php/func_filesystem_fopen.asp

flock詳細介紹:http://www.w3school.com.cn/php/func_filesystem_flock.asp

fclose詳細介紹:http://www.w3school.com.cn/php/func_filesystem_fclose.asp

public function index(){
    $fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
$find=Db::name('user')->where('username','name2')->find();
if($find){
$data['username']='name3';
$data['password']='';
$data['password_m']='';
Db::name('user')->insert($data);
}else{
$data['username']='name2';
$data['password']='';
$data['password_m']='';
Db::name('user')->insert($data);
}

flock($fp,LOCK_UN);
}
fclose($fp);

return
'success';

}
注意:對於小並發可行,而且性能不會出現大的影響。並發小於500較好,如果過高的話,建議使用隊列模式。

2.php非阻塞模式
非阻塞模式我們常用在php程序內部調用第三方api接口,或者不需要等待結果的程序。

舉一個簡單的例子。發送郵件,你要發送給你的所有的老大,那么你需要全部都發送一遍,也許你得寫一個循環,那么這一個循環中發郵件的方法需要執行時間,需要拿到返回值,執行下一次循環,這個時間依次累加,最后時間會邊的很長,
那么這種被稱之為阻塞,而我們一直想要的是提交過去,不需要等待返回數據,你就循環的跑一遍就好了,那么我們想的這個就是非阻塞模式。對於這種的話,php也沒有什么好的函數來處理,所以我們做的最多的還是隊列出來,發郵件的時候,
根據隊列去執行,其實用到的還是阻塞模式。但是我們的請求執行時間會被壓縮的很短,最常用的就是調用API接口,而你此時又不關心返回值的時候。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM