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 相关文章推荐
phpMyAdmin 安装配置方法和问题解决
Jun 08 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
php构造函数实例讲解
Nov 13 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
创建无限极分类树型结构的简单方法
Jun 20 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
php对象工厂类完整示例
Aug 09 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
用Laravel轻松处理千万级数据的方法实现
Dec 25 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的远程图片抓取函数分享
2013/09/25 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
JavaScript延迟加载
2021/03/09 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
vue实现循环切换动画
2018/10/17 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
opencv python图像梯度实例详解
2020/02/04 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
工程预算与管理应届生求职信
2013/10/06 职场文书
查环查孕证明
2014/01/10 职场文书
自我推荐信范文
2014/05/09 职场文书
党员公开承诺书内容
2014/05/20 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
企业培训简报范文
2015/07/20 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
导游词之昭君岛
2020/01/17 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis