国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP使用pcntl_fork實現(xiàn)多進程下載圖片的方法

2024-05-04 23:28:58
字體:
供稿:網(wǎng)友
這篇文章主要介紹了PHP使用pcntl_fork實現(xiàn)多進程下載圖片的方法,較為詳細(xì)的分析了pcntl_fork的原理與用法,以及使用pcntl_fork實現(xiàn)多進程下載圖片的方法,非常具有實用價值,需要的朋友可以參考下
 
 

本文實例講述了PHP使用pcntl_fork實現(xiàn)多進程下載圖片的方法。分享給大家供大家參考。具體分析如下:

PHP pcntl_fork — 在當(dāng)前進程當(dāng)前位置產(chǎn)生分支,子進程,譯注:fork是創(chuàng)建了一個子進程,父進程和子進程 都從fork的位置開始向下繼續(xù)執(zhí)行,不同的是父進程執(zhí)行過程中,得到的fork返回值為子進程號,而子進程得到的是0.

注意:PHP有個pcntl_fork的函數(shù)可以實現(xiàn)多進程,但要加載pcntl拓展,而且只有在linux下才能編譯這個拓展.

1.首先在ubuntu下編譯pcntl.so,我的ubuntu下找不到pcntl的包,于是創(chuàng)建一個文件夾下載了整個PHP包,在里面找到了pcntl包運行如下命令,代碼如下:

復(fù)制代碼代碼如下:
# mkdir php 
# cd php 
# apt-get source php5 
# cd php5-(WHATEVER_RELEASE)/ext/pcntl 
# phpize 
# ./configure (注一) 
# make 
# make install phpize 命令是用來準(zhǔn)備 PHP 外掛模塊的編譯環(huán)境的

 

成功的安裝將建立 extname.so 并放置于 PHP 的外掛模塊目錄中(預(yù)設(shè)存放于 /usr/lib/php/modules/ 內(nèi)),需要調(diào)整 php.ini,加入 extension=extname.so 這一行之后才能使用此外掛模塊.

例:

復(fù)制代碼代碼如下:
void pcntl_exec(string $path [,array $args [,array $envs ]])

 

pcntl_exec — 在當(dāng)前進程空間執(zhí)行指定程序,代碼如下:

復(fù)制代碼代碼如下:
$cmds=array( 
        array('/home/jerry/projects/www/test2.php'), 
        array('/home/jerry/projects/www/test3.php') 
); 
 
foreach($cmds as $cmd){ 
        $pid=pcntl_fork(); 
        if($pid==-1){ 
        //進程創(chuàng)建失敗 
            echo '創(chuàng)建子進程失敗時返回-1'; 
            exit(-1); 
        } 
        else if($pid){ 
        //父進程會得到子進程號,所以這里是父進程執(zhí)行的邏輯 
            pcntl_wait($status,WNOHANG); 
        } 
        else{ 
        //子進程處理邏輯 
            sleep(5); 
            pcntl_exec('/usr/bin/php',$cmd); 
            exit(0); 
        } 
}

例,實例多圖片同步下載,代碼如下:
復(fù)制代碼代碼如下:
#!/usr/bin/php 
<?php 
// 需要抓取的網(wǎng)頁地址 
$url = 'http://www.survivalescaperooms.com'; 
$content = file_get_contents($url); 
preg_match_all('/<imgs+src="(.*?)"/', $content, $matches,PREG_SET_ORDER); 
echo "已發(fā)現(xiàn)".count($matches)."張圖片n"; 
 
list($sm, $ss) = explode(" ", microtime()); 
foreach ($matches as $k => $val) 

 $pid[$k] = pcntl_fork(); 
 if(!$pid[$k]) 
 { 
  download($url, $val); 
  // 子進程要exit否則會進行遞歸多進程,父進程不要exit否則終止多進程 
  exit(0); 
 } 
 
 if ($pid[$k]) 
 { 
//    pcntl_waitpid($pid[$k], $status, WUNTRACED); 
 } 
 

echo "下載完成n"; 
 
list($em, $es) = explode(" ", microtime()); 
 
echo "用時:",($es+$em) - ($ss + $sm),"n"; 
/** 
 * 抓取網(wǎng)頁圖片 
 *  
 */ 
function download($url, $val) 

 $pic_url = $val[1]; 
 if (strpos($val[1], '//') !== false) 
 { 
  ; 
 } 
 elseif (preg_match('@^(.*?)/@', $val[1], $inner_matches) == 0) 
 { 
  $pic_url = $url.$val[1]; 
 } 
 elseif (preg_match('@[:.]@', $inner_matches[1], $tmp_matches) == 0) 
 { 
  $pic_url = $url.$val[1]; 
 } 
 
 $pic = file_get_contents($pic_url); 
 
 if ($pic === false) 
 { 
  return; 
 } 
 
 preg_match('@/([^/]+)$@', $pic_url, $tmp_matches); 
 // 可使用assert處理異常 
 $pic_file_name = $tmp_matches[1]; 
 $f = fopen("tmp/".$pic_file_name, "wb"); # 
 fwrite($f, $pic); 
 fclose($f); 

 
/* End of file pcntl_fork.php */ 
?>

 

希望本文所述對大家的PHP程序設(shè)計有所幫助。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 商都县| 克什克腾旗| 日土县| 西乡县| 隆安县| 阿鲁科尔沁旗| 宾阳县| 西林县| 报价| 桐乡市| 定安县| 深圳市| 东阳市| 仙游县| 寿阳县| 会泽县| 建湖县| 岚皋县| 诸暨市| 河源市| 涿州市| 伊川县| 苍溪县| 勐海县| 阿拉善右旗| 衡山县| 江口县| 华池县| 清徐县| 西乌珠穆沁旗| 滕州市| 郴州市| 安达市| 塔河县| 和政县| 昭觉县| 锡林郭勒盟| 雷波县| 乌兰县| 逊克县| 射阳县|