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 相关文章推荐
不用GD库生成当前时间的PNG格式图象的程序
Oct 09 PHP
PHP配置文件中最常用四个ini函数
Mar 19 PHP
Mysql中分页查询的两个解决方法比较
May 02 PHP
PHP 使用pcntl和libevent 实现Timer功能
Oct 27 PHP
PHP基本语法总结
Sep 06 PHP
从wamp到xampp的升级之路
Apr 08 PHP
php实现的任意进制互转类分享
Jul 07 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 PHP
PHP中多线程的两个实现方法
Oct 14 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
基于laravel Request的所有方法详解
Sep 29 PHP
PHP命名空间(namespace)原理与用法详解
Dec 11 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选择排序法实现数组排序实例分析
2015/02/16 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
前端微信支付js代码
2016/07/25 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
Python内置数据类型详解
2014/08/18 Python
给Python初学者的一些编程技巧
2015/04/03 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python内置数据类型之列表操作
2018/11/12 Python
详解用python生成随机数的几种方法
2019/08/04 Python
python计算n的阶乘的方法代码
2019/10/25 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
教师自我评价范例
2013/09/24 职场文书
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
九年级家长会邀请函
2014/01/15 职场文书
2014年社区学雷锋活动总结
2014/03/09 职场文书
工程项目建议书范文
2014/03/12 职场文书
2014年女职工工作总结
2014/11/27 职场文书
2016年国培研修日志
2015/11/13 职场文书