欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

PHP之pcntl_fork多進程并發(fā)編程示例-創(chuàng)新互聯(lián)

  待下載的網(wǎng)頁地址放在$urls數(shù)組中,按指定的并發(fā)數(shù)多進程下載網(wǎng)頁,下載的網(wǎng)頁保存在本地硬盤,下載的網(wǎng)頁大小通過linux消息隊列發(fā)送給父進程累加,全部網(wǎng)頁下載完成后,父進程顯示下載的網(wǎng)頁數(shù)、字節(jié)數(shù)。代碼如下。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供銅山企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站建設、成都網(wǎng)站設計H5頁面制作、小程序制作等業(yè)務。10年已為銅山眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡公司優(yōu)惠進行中。<? //$urls數(shù)組用于保存要下載的網(wǎng)址,實際應用中一般從文件或數(shù)據(jù)庫中讀取網(wǎng)址保存到$urls中。 $urls = array('http://www.qq.com','http://www.sohu.com','http://www.sina.com.cn',....); $urls_num = count($urls);//數(shù)組大小,也是網(wǎng)址數(shù)量 $msg_file = "/tmp/download_msgqueue.txt";//下面3行創(chuàng)建linux消息隊列下,該文件須先創(chuàng)建好 $msg_queuekey = ftok($msg_file,'R');//touch /tmp/download_msgqueue.txt $msg_queue = msg_get_queue($msg_queuekey, 0666);  $maxtasknum = 5;//設定并發(fā)進程數(shù) $ct = 0;//$urls數(shù)組用的計數(shù)器 $cttask = 0;//并發(fā)進程計數(shù)器 $pids = array();//保存進程的數(shù)組 $total_bytes = 0;//下載網(wǎng)頁的字節(jié)數(shù) while ($ct<$urls_num) {//循環(huán)抓取$urls數(shù)組中指定的網(wǎng)頁 while ($cttask<$maxtasknum && $ctproc<$urls_num) {//fork出指定的并發(fā)數(shù)進程 $pids[$ct] = pcntl_fork(); if ($pids[$ct]==-1) { echo "create subproc fail.\n"; exit(0); } elseif ($pids[$ct]>0) {//父進程 } elseif ($pids[$ct]==0) {//子進程 download($urls[$ct], $msg_queue); exit(0); } $cttask++; $ct++; } $tmppid = pcntl_waitpid(0, $status);//等待子進程結束 foreach($pids as $key => $pid) {     if($tmppid == $pid){     unset($pids[$key]);     $cttask--;//子進程結束后,并發(fā)進程計數(shù)器減1     } } do {//從消息隊列出取出每個網(wǎng)頁的大小,計算下載的字節(jié)數(shù)。如果要下載的網(wǎng)頁很多,需要把此段代碼放到下載網(wǎng)頁的循環(huán)中,否則可能會出現(xiàn)隊列滿的情況。 msg_receive($msg_queue, 0, $message_type, 16, $message, true, MSG_IPC_NOWAIT);  //echo "[".$message."]\n"; $total_bytes += $message; $a = msg_stat_queue($msg_queue); if($a['msg_qnum'] == 0){//這種方式退出比$ct==$urls_num好,因為如果fork==-1,就不會有$urls_num個消息,程序會永遠等待消息。     break; } } while(true); } while ($cttask > 0) {//等待最后$cttask個子進程結束 $tmppid = pcntl_waitpid(0,$status); foreach($pids as $key => $pid) {     if($tmppid == $pid){     unset($pids[$key]);     $cttask--;     } } } do {//取得最后$cttask個子進程的消息 msg_receive($msg_queue, 0, $message_type, 16, $message, true, MSG_IPC_NOWAIT);  //echo "[".$message."]\n"; $total_bytes += $message; $a = msg_stat_queue($msg_queue); if($a['msg_qnum'] == 0){     break; } } while(true); msg_remove_queue($msg_queue);//刪除消息隊列 echo "\nDone. download: ".$urls_num." pages,total: ".round($total_bytes/1024,3)." KB \n"; exit(0); function download($url, $msg_queue) {//下載指定網(wǎng)頁,把內容保存在本地硬盤,并下載內容的長度放入消息隊列中 $dirname = "/tmp/donwload/";//保存下載網(wǎng)頁的目錄,要事先創(chuàng)建好 $content = file_get_contents($url); if ($content === false) { $content = 0; } $url_parts = parse_url($url); $fname = $dirname.$url_parts['host']; $ret = file_put_contents($fname, $content); msg_send($msg_queue, 1, strlen($content)); }  ?>

參考資料:

PHP實現(xiàn)進程間通信:消息隊列 https://www.douban.com/note/245520545/

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享文章:PHP之pcntl_fork多進程并發(fā)編程示例-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://chinadenli.net/article48/ccgoep.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設面包屑導航微信小程序網(wǎng)站改版做網(wǎng)站軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司