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

首頁 > 語言 > PHP > 正文

PHP pcntl_fork多進程下載圖片實例

2024-09-04 11:45:07
字體:
來源:轉載
供稿:網友

PHP pcntl_fork — 在當前進程當前位置產生分支,子進程,譯注:fork是創建了一個子進程,父進程和子進程 都從fork的位置開始向下繼續執行,不同的是父進程執行過程中,得到的fork返回值為子進程號,而子進程得到的是0.

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

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

  1. mkdir php 
  2. # cd php 
  3. # apt-get source php5 
  4. # cd php5-(WHATEVER_RELEASE)/ext/pcntl 
  5. # phpize 
  6. # ./configure (注一) 
  7. # make 
  8. # make install phpize 命令是用來準備 PHP 外掛模塊的編譯環境的 

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

例:void pcntl_exec(string $path [,array $args [,array $envs ]])

pcntl_exec — 在當前進程空間執行指定程序,代碼如下:

  1. $cmds=array
  2.  
  3.         array('/home/jerry/projects/www/test2.php'), 
  4.  
  5.         array('/home/jerry/projects/www/test3.php'
  6.  
  7. ); 
  8.  
  9. foreach($cmds as $cmd){ 
  10.  
  11.         $pid=pcntl_fork(); 
  12.  
  13.         if($pid==-1){ 
  14.  
  15.         //進程創建失敗 
  16.  
  17.             echo '創建子進程失敗時返回-1'
  18.  
  19.             exit(-1); 
  20.  
  21.         } 
  22.  
  23.         else if($pid){ 
  24.  
  25.         //父進程會得到子進程號,所以這里是父進程執行的邏輯 
  26.             
  27.             pcntl_wait($status,WNOHANG); 
  28.  
  29.         } 
  30.  
  31.         else
  32.  
  33.         //子進程處理邏輯 
  34.  
  35.             sleep(5); 
  36.  
  37.             pcntl_exec('/usr/bin/php',$cmd); 
  38.  
  39.             exit(0); 
  40.  
  41.         } 
  42.  

例,實例多圖片同步下載,代碼如下:

  1. #!/usr/bin/php 
  2. <?php 
  3. // 需要抓取的網頁地址 
  4. $url = 'http://www.survivalescaperooms.com'
  5. $content = file_get_contents($url); 
  6. preg_match_all('/<imgs+src="(.*?)"/'$content$matches,PREG_SET_ORDER); 
  7. echo "已發現".count($matches)."張圖片n"
  8.  
  9. list($sm$ss) = explode(" ", microtime()); 
  10. foreach ($matches as $k => $val
  11.  $pid[$k] = pcntl_fork(); 
  12.  if(!$pid[$k]) 
  13.  { 
  14.   download($url$val); 
  15.   // 子進程要exit否則會進行遞歸多進程,父進程不要exit否則終止多進程 
  16.   exit(0); 
  17.  } 
  18.  
  19.  if ($pid[$k]) 
  20.  { 
  21. //    pcntl_waitpid($pid[$k], $status, WUNTRACED); 
  22.  } 
  23.  
  24. echo "下載完成n"
  25.  
  26. list($em$es) = explode(" ", microtime()); 
  27.  
  28. echo "用時:",($es+$em) - ($ss + $sm),"n"
  29. /** 
  30.  * 抓取網頁圖片 
  31.  *  
  32.  */ 
  33. function download($url$val
  34.  $pic_url = $val[1]; 
  35.  if (strpos($val[1], '//') !== false) 
  36.  { 
  37.   ; 
  38.  } 
  39.  elseif (preg_match('@^(.*?)/@'$val[1], $inner_matches) == 0) 
  40.  { 
  41.   $pic_url = $url.$val[1]; 
  42.  } 
  43.  elseif (preg_match('@[:.]@'$inner_matches[1], $tmp_matches) == 0) 
  44.  { 
  45.   $pic_url = $url.$val[1]; 
  46.  } 
  47.  
  48.  $pic = file_get_contents($pic_url); 
  49.  
  50.  if ($pic === false) 
  51.  { 
  52.   return
  53.  } 
  54.  
  55.  preg_match('@/([^/]+)$@'$pic_url$tmp_matches); 
  56.  // 可使用assert處理異常 
  57.  $pic_file_name = $tmp_matches[1]; 
  58.  $f = fopen("tmp/".$pic_file_name"wb"); # 
  59.  fwrite($f$pic); 
  60.  fclose($f); 
  61.  
  62. /* End of file pcntl_fork.php */ 
  63. ?>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 若羌县| 轮台县| 富裕县| 汉沽区| 游戏| 东乌珠穆沁旗| 蓝山县| 荣成市| 烟台市| 家居| 荥阳市| 沧州市| 遵义县| 泰州市| 讷河市| 荔浦县| 贡觉县| 沧州市| 沾化县| 宣城市| 内黄县| 泽州县| 于田县| 色达县| 广东省| 英超| 淮滨县| 房山区| 安达市| 富川| 开平市| 伊宁市| 额敏县| 海兴县| 高碑店市| 怀来县| 林周县| 汶上县| 杂多县| 思茅市| 霍山县|