利用WEB服務(wù)器本身的多線程來(lái)處理,從WEB服務(wù)器多次調(diào)用我們需要實(shí)現(xiàn)多線程的程序。

10年積累的成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有棗莊免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
PHP中也能多線程了,那么問(wèn)題也來(lái)了,那就是同步的問(wèn)題。
安徽電腦培訓(xùn)知道PHP本身是不支持多線程的,所以更不會(huì)有什么像Java中synchronize的方法了。
那我們?cè)撊绾巫瞿兀?.盡量不訪問(wèn)同一個(gè)資源。
以避免沖突。
但是可以同時(shí)像數(shù)據(jù)庫(kù)操作。
因?yàn)閿?shù)據(jù)庫(kù)是支持并發(fā)操作的。
所以在多線程的PHP中不要向同一個(gè)文件中寫入數(shù)據(jù)。
如果必須要寫的話,用別的方法進(jìn)行同步。
如調(diào)用flock對(duì)文件進(jìn)行加鎖等。
或建立臨時(shí)文件,并在另外的線程中等待這個(gè)文件的消失while(file_exits('xxx'));這樣就等于這個(gè)臨時(shí)文件存在時(shí),表示其實(shí)線程正在操作。
如果沒(méi)有了這個(gè)文件,說(shuō)明其它線程已經(jīng)釋放了這個(gè)。
2.盡量不要從runThread在執(zhí)行fputs后取這個(gè)socket中讀取數(shù)據(jù)。
因?yàn)橐獙?shí)現(xiàn)多線程,需要的用非阻塞模式。
即在像fgets這樣的函數(shù)時(shí)立即返回。
。
所以讀寫數(shù)據(jù)就會(huì)出問(wèn)題。
如果使用阻塞模式的話,程序就不算是多線程了。
他要等上面的返回才執(zhí)行下面的程序。
所以如果需要交換數(shù)據(jù)最后利用外面文件或數(shù)據(jù)中完成。
實(shí)在想要的話就用socket_set_nonblock($fp)來(lái)實(shí)現(xiàn)。
說(shuō)了這么多,倒底這個(gè)有沒(méi)有實(shí)際的意義呢?在什么時(shí)候需要這種用這種方法呢?答案是肯定的。
大家知道。
在一個(gè)不斷讀取網(wǎng)絡(luò)資源的應(yīng)用中,網(wǎng)絡(luò)的速度是瓶頸。
如果采多這種形式就可以同時(shí)以多個(gè)線程對(duì)不同的頁(yè)面進(jìn)行讀取。
#!/usr/bin/env?php
?php
$cmds=array(
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',2)
);
foreach($cmds?as?$cmd){
$pid=pcntl_fork();
if($pid==-1){?//進(jìn)程創(chuàng)建失敗
die('fork?child?process?failure!');
}
else?if($pid){?//父進(jìn)程處理邏輯
pcntl_wait($status,WNOHANG);
}
else{?//子進(jìn)程處理邏輯
pcntl_exec('/usr/local/bin/php',$cmd);
}
}
/*
*flock(file,lock,block)
*file 必需,規(guī)定要鎖定或釋放的已打開(kāi)的文件
*lock 必需。規(guī)定要使用哪種鎖定類型。
*block 可選。若設(shè)置為 1 或 true,則當(dāng)進(jìn)行鎖定時(shí)阻擋其他進(jìn)程。
*lock
*LOCK_SH 要取得共享鎖定(讀取的程序)
*LOCK_EX 要取得獨(dú)占鎖定(寫入的程序)
*LOCK_UN 要釋放鎖定(無(wú)論共享或獨(dú)占)
*LOCK_NB 如果不希望 flock() 在鎖定時(shí)堵塞
/*
if (flock($file,LOCK_EX))
{
fwrite($file,'write more words');
flock($file,LOCK_UN);
}
else
{
//處理錯(cuò)誤邏輯
}
fclose($file);
)
多進(jìn)程同時(shí)修改一個(gè)文件是很容易造成這樣的情況,建議使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ),編程就非常簡(jiǎn)單,鎖可以細(xì)到記錄級(jí)。
如果必須使用文件,一般的辦法是讀文件前判斷是否存在臨時(shí)文件,存在就放棄(或者等待),只有不存在臨時(shí)文件才繼續(xù)操作,繼續(xù)操作的第一步是建立臨時(shí)文件,修改文件,最后刪除臨時(shí)文件。
文章名稱:php多進(jìn)程處理數(shù)據(jù) php進(jìn)程太多
分享網(wǎng)址:http://chinadenli.net/article24/ddodeje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、服務(wù)器托管、用戶體驗(yàn)、微信小程序、App設(shè)計(jì)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)