待下載的網(wǎng)頁(yè)地址放在$urls數(shù)組中,按指定的并發(fā)數(shù)多進(jìn)程下載網(wǎng)頁(yè),下載的網(wǎng)頁(yè)保存在本地硬盤,下載的網(wǎng)頁(yè)大小通過(guò)linux消息隊(duì)列發(fā)送給父進(jìn)程累加,全部網(wǎng)頁(yè)下載完成后,父進(jìn)程顯示下載的網(wǎng)頁(yè)數(shù)、字節(jié)數(shù)。代碼如下。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供銅山企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為銅山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。<? //$urls數(shù)組用于保存要下載的網(wǎng)址,實(shí)際應(yīng)用中一般從文件或數(shù)據(jù)庫(kù)中讀取網(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消息隊(duì)列下,該文件須先創(chuàng)建好 $msg_queuekey = ftok($msg_file,'R');//touch /tmp/download_msgqueue.txt $msg_queue = msg_get_queue($msg_queuekey, 0666); $maxtasknum = 5;//設(shè)定并發(fā)進(jìn)程數(shù) $ct = 0;//$urls數(shù)組用的計(jì)數(shù)器 $cttask = 0;//并發(fā)進(jìn)程計(jì)數(shù)器 $pids = array();//保存進(jìn)程的數(shù)組 $total_bytes = 0;//下載網(wǎng)頁(yè)的字節(jié)數(shù) while ($ct<$urls_num) {//循環(huán)抓取$urls數(shù)組中指定的網(wǎng)頁(yè) while ($cttask<$maxtasknum && $ctproc<$urls_num) {//fork出指定的并發(fā)數(shù)進(jìn)程 $pids[$ct] = pcntl_fork(); if ($pids[$ct]==-1) { echo "create subproc fail.\n"; exit(0); } elseif ($pids[$ct]>0) {//父進(jìn)程 } elseif ($pids[$ct]==0) {//子進(jìn)程 download($urls[$ct], $msg_queue); exit(0); } $cttask++; $ct++; } $tmppid = pcntl_waitpid(0, $status);//等待子進(jìn)程結(jié)束 foreach($pids as $key => $pid) { if($tmppid == $pid){ unset($pids[$key]); $cttask--;//子進(jìn)程結(jié)束后,并發(fā)進(jìn)程計(jì)數(shù)器減1 } } do {//從消息隊(duì)列出取出每個(gè)網(wǎng)頁(yè)的大小,計(jì)算下載的字節(jié)數(shù)。如果要下載的網(wǎng)頁(yè)很多,需要把此段代碼放到下載網(wǎng)頁(yè)的循環(huán)中,否則可能會(huì)出現(xiàn)隊(duì)列滿的情況。 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好,因?yàn)槿绻鹒ork==-1,就不會(huì)有$urls_num個(gè)消息,程序會(huì)永遠(yuǎn)等待消息。 break; } } while(true); } while ($cttask > 0) {//等待最后$cttask個(gè)子進(jìn)程結(jié)束 $tmppid = pcntl_waitpid(0,$status); foreach($pids as $key => $pid) { if($tmppid == $pid){ unset($pids[$key]); $cttask--; } } } do {//取得最后$cttask個(gè)子進(jì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){ break; } } while(true); msg_remove_queue($msg_queue);//刪除消息隊(duì)列 echo "\nDone. download: ".$urls_num." pages,total: ".round($total_bytes/1024,3)." KB \n"; exit(0); function download($url, $msg_queue) {//下載指定網(wǎng)頁(yè),把內(nèi)容保存在本地硬盤,并下載內(nèi)容的長(zhǎng)度放入消息隊(duì)列中 $dirname = "/tmp/donwload/";//保存下載網(wǎng)頁(yè)的目錄,要事先創(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實(shí)現(xiàn)進(jìn)程間通信:消息隊(duì)列 https://www.douban.com/note/245520545/
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享文章:PHP之pcntl_fork多進(jìn)程并發(fā)編程示例-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://m.rwnh.cn/article48/ccgoep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、面包屑導(dǎo)航、微信小程序、網(wǎng)站改版、做網(wǎng)站、軟件開(kāi)發(fā)
聲明:本網(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)
猜你還喜歡下面的內(nèi)容