PHP之pcntl_fork多進程并發編程示例-創新互聯

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

創新互聯公司是一家專業提供銅山企業網站建設,專注與成都網站建設、成都網站設計H5頁面制作、小程序制作等業務。10年已為銅山眾多企業、政府機構等服務。創新互聯專業網絡公司優惠進行中。<? //$urls數組用于保存要下載的網址,實際應用中一般從文件或數據庫中讀取網址保存到$urls中。 $urls = array('http://www.qq.com','http://www.sohu.com','http://www.sina.com.cn',....); $urls_num = count($urls);//數組大小,也是網址數量 $msg_file = "/tmp/download_msgqueue.txt";//下面3行創建linux消息隊列下,該文件須先創建好 $msg_queuekey = ftok($msg_file,'R');//touch /tmp/download_msgqueue.txt $msg_queue = msg_get_queue($msg_queuekey, 0666);  $maxtasknum = 5;//設定并發進程數 $ct = 0;//$urls數組用的計數器 $cttask = 0;//并發進程計數器 $pids = array();//保存進程的數組 $total_bytes = 0;//下載網頁的字節數 while ($ct<$urls_num) {//循環抓取$urls數組中指定的網頁 while ($cttask<$maxtasknum && $ctproc<$urls_num) {//fork出指定的并發數進程 $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--;//子進程結束后,并發進程計數器減1     } } do {//從消息隊列出取出每個網頁的大小,計算下載的字節數。如果要下載的網頁很多,需要把此段代碼放到下載網頁的循環中,否則可能會出現隊列滿的情況。 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) {//下載指定網頁,把內容保存在本地硬盤,并下載內容的長度放入消息隊列中 $dirname = "/tmp/donwload/";//保存下載網頁的目錄,要事先創建好 $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實現進程間通信:消息隊列 https://www.douban.com/note/245520545/

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

分享文章:PHP之pcntl_fork多進程并發編程示例-創新互聯
本文網址:http://m.kartarina.com/article48/ccgoep.html

成都網站建設公司_創新互聯,為您提供手機網站建設面包屑導航微信小程序網站改版做網站軟件開發

廣告

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

成都網頁設計公司
主站蜘蛛池模板: 免费无码又爽又刺激网站直播 | 久久亚洲AV成人无码国产电影| 无码日韩精品一区二区三区免费| 亚洲精品无码永久在线观看你懂的| 精品三级AV无码一区| 无码综合天天久久综合网| 熟妇人妻AV无码一区二区三区| 成人免费无码精品国产电影| 亚洲AV日韩AV高潮无码专区| 亚洲精品无码你懂的网站| 中文无码精品A∨在线观看不卡| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久久久久久人妻无码中文字幕爆| 亚洲AV无码一区二区三区久久精品| 国产在线无码精品电影网| 成人免费一区二区无码视频| 亚洲国产成人精品无码区在线秒播| 成人av片无码免费天天看| 久久亚洲精品成人无码| 无码区日韩特区永久免费系列| 亚洲精品无码久久千人斩| 无码视频在线播放一二三区| 无码人妻精品内射一二三AV| 亚洲av无码专区在线| 久久久久久AV无码免费网站下载| 国产成人无码区免费网站| 亚洲 无码 在线 专区| 无遮掩无码h成人av动漫| 亚洲中文字幕无码亚洲成A人片| 无码人妻精品一区二区| 亚洲av无码不卡一区二区三区| 一本大道东京热无码一区| 国产亚洲精久久久久久无码AV| 国产无码网页在线观看| r级无码视频在线观看| 九九久久精品无码专区| 国产网红主播无码精品| 国产AV无码专区亚洲Av| 西西午夜无码大胆啪啪国模| 日韩精品无码一区二区三区| 18精品久久久无码午夜福利|