首先說一下概念,有很多人不理解這個概念。如果看完后還是一頭霧水就多讀幾次。
阻塞與非阻塞
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。
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接口,而你此時又不關心返回值的時候。