国产探花免费观看_亚洲丰满少妇自慰呻吟_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://m.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ā)表
主站蜘蛛池模板: 广饶县| 伊吾县| 新龙县| 高雄市| 阜新市| 柳州市| 宜黄县| 滁州市| 英吉沙县| 西吉县| 湖州市| 南木林县| 漾濞| 托克托县| 新兴县| 会东县| 察隅县| 图片| 淳安县| 怀化市| 同仁县| 探索| 三门县| 富裕县| 江永县| 高平市| 陇西县| 定安县| 郎溪县| 忻州市| 周宁县| 时尚| 全椒县| 涪陵区| 天津市| 吉林市| 涿州市| 黄大仙区| 崇左市| 宜黄县| 久治县|