待下載的網(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)