PHP使用pcntl_fork实现多进程下载图片的方法


Posted in PHP onDecember 16, 2014

本文实例讲述了PHP使用pcntl_fork实现多进程下载图片的方法。分享给大家供大家参考。具体分析如下:

PHP pcntl_fork — 在当前进程当前位置产生分支,子进程,译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0.

注意:PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展.

1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令,代码如下:

# mkdir php 

# cd php 

# apt-get source php5 

# cd php5-(WHATEVER_RELEASE)/ext/pcntl 

# phpize 

# ./configure (注一) 

# make 

# 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 — 在当前进程空间执行指定程序,代码如下:

$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){ 

        //进程创建失败 

            echo '创建子进程失败时返回-1'; 

            exit(-1); 

        } 

        else if($pid){ 

        //父进程会得到子进程号,所以这里是父进程执行的逻辑 

            pcntl_wait($status,WNOHANG); 

        } 

        else{ 

        //子进程处理逻辑 

            sleep(5); 

            pcntl_exec('/usr/bin/php',$cmd); 

            exit(0); 

        } 

}

例,实例多图片同步下载,代码如下:
#!/usr/bin/php 

<?php 

// 需要抓取的网页地址 

$url = 'https://3water.com'; 

$content = file_get_contents($url); 

preg_match_all('/<imgs+src="(.*?)"/', $content, $matches,PREG_SET_ORDER); 

echo "已发现".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"; 

/** 

 * 抓取网页图片 

 *  

 */ 

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程序设计有所帮助。

PHP 相关文章推荐
常见的PHP五种设计模式小结
Mar 23 PHP
PHP中redis的用法深入解析
Feb 20 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
php获取从html表单传递数组的方法
Mar 20 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
PHP与SQL语句常用大全
Dec 10 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 PHP
基于php编程规范(详解)
Aug 17 PHP
PHP APP微信提现接口代码
Sep 30 PHP
php时间戳转换代码详解
Aug 04 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 PHP
php中最简单的字符串匹配算法
Dec 16 #PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 #PHP
php输出金字塔的2种实现方法
Dec 16 #PHP
smarty缓存用法分析
Dec 16 #PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 #PHP
smarty表格换行实例
Dec 15 #PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 #PHP
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php动态生成函数示例
2014/03/21 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
网页自动跳转代码收集
2009/09/27 Javascript
读jQuery之一(对象的组成)
2011/06/11 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python网络编程之五子棋游戏
2020/05/14 Python
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
环境科学专业大学生自荐信格式
2013/09/21 职场文书
智能电子应届生求职信
2013/11/10 职场文书
《童年》教学反思
2014/02/18 职场文书
初中作文评语大全
2014/04/23 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
建议书的格式及范文
2015/09/14 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电