新聞中心
本文操作環(huán)境:Windows10系統(tǒng)、php7.1版、Dell G3電腦。

創(chuàng)新互聯公司的客戶來自各行各業(yè),為了共同目標,我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領域包括成都網站設計、做網站、電商網站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態(tài).
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。
1.php并發(fā)阻塞
對于php來說并發(fā)是個問題,工作中經常會碰到一些,寫庫之前的查詢,判斷數據是否存在,但是如果并發(fā)的情況下,就會導致數據重復寫入,而你的判斷也成了虛設。所以有了阻塞,我們需要把請求一條一條的執(zhí)行。
簡單介紹:
1.首先,讀寫方式打開或者創(chuàng)建文件lock.txt文件
2.給lock.txt文件上 "獨占鎖",上鎖成功后就可以進行下一步"處理訂單商品數據了"
3.處理完數據后,要"釋放鎖”,以及fclose關閉打開的文件
注意:給文件“獨占鎖”后,如果再沒有里面的“釋放鎖”,會出現非??ǖ那闆r
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';
}
注意:對于小并發(fā)可行,而且性能不會出現大的影響。并發(fā)小于500較好,如果過高的話,建議使用隊列模式。
2.php非阻塞模式
非阻塞模式我們常用在php程序內部調用第三方api接口,或者不需要等待結果的程序。
舉一個簡單的例子。發(fā)送郵件,你要發(fā)送給你的所有的老大,那么你需要全部都發(fā)送一遍,也許你得寫一個循環(huán),那么這一個循環(huán)中發(fā)郵件的方法需要執(zhí)行時間,需要拿到返回值,執(zhí)行下一次循環(huán),這個時間依次累加,最后時間會邊的很長,
那么這種被稱之為阻塞,而我們一直想要的是提交過去,不需要等待返回數據,你就循環(huán)的跑一遍就好了,那么我們想的這個就是非阻塞模式。對于這種的話,php也沒有什么好的函數來處理,所以我們做的最多的還是隊列出來,發(fā)郵件的時候,
根據隊列去執(zhí)行,其實用到的還是阻塞模式。但是我們的請求執(zhí)行時間會被壓縮的很短,最常用的就是調用API接口,而你此時又不關心返回值的時候。
當前名稱:php程序阻塞與非阻塞的區(qū)別是什么
文章源于:http://fisionsoft.com.cn/article/ccsoedg.html


咨詢
建站咨詢
