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 mysql数据库操作类
Jun 04 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
php微信支付之APP支付方法
Mar 04 PHP
php实现cookie加密的方法
Mar 10 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
php实现复制移动文件的方法
Jul 29 PHP
[原创]php简单隔行变色功能实现代码
Jul 09 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 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 MYSQL 数据备份类
2009/06/19 PHP
解析php中die(),exit(),return的区别
2013/06/20 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
php获取微信openid方法总结
2019/10/10 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
python GUI实例学习
2017/11/21 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
python游戏地图最短路径求解
2019/01/16 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
警示教育活动总结
2014/05/05 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
教你用python控制安卓手机
2021/05/13 Python