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 相关文章推荐
多重?l件?合查?(二)
Oct 09 PHP
如何实现给定日期的若干天以后的日期
Oct 09 PHP
php下判断数组中是否存在相同的值array_unique
Mar 25 PHP
PHP中=赋值操作符对不同数据类型的不同行为
Jan 02 PHP
php实现文件下载代码分享
Aug 19 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 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
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
对python中各个response的使用说明
2020/03/28 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
AmazeUI框架搭建的方法步骤(图文)
2020/08/17 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
村优秀党员事迹材料
2014/01/15 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
廉洁校园实施方案
2014/05/25 职场文书
2014国庆节标语口号
2014/09/19 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
python编写函数注意事项总结
2021/03/29 Python
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript