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程序?
Dec 08 PHP
php 数组的指针操作实现代码
Feb 08 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
php实现的ping端口函数实例
Nov 12 PHP
php类常量用法实例分析
Jul 09 PHP
PHP网站建设的流程与步骤分享
Sep 25 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
Apr 26 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
PHP实现链表的定义与反转功能示例
Jun 09 PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 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中使用excel的简单介绍
2013/08/02 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
在Python的Django框架中包装视图函数
2015/07/20 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
简述Python2与Python3的不同点
2018/01/21 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
Python中的Numpy矩阵操作
2018/08/12 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
党员学习十八大感想
2014/01/17 职场文书
学校消防安全责任书
2014/07/23 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
统招统分证明
2015/06/23 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
HTML基础详解(上)
2021/10/16 HTML / CSS