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 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
我的论坛源代码(三)
Oct 09 PHP
php MsSql server时遇到的中文编码问题
Jun 11 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
PHP文件锁定写入实例解析
Jul 14 PHP
迁移PHP版本到PHP7
Feb 06 PHP
php版微信自定义回复功能示例
Dec 05 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
PHP实现微信退款功能
Oct 02 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 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网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
jQuery实用函数用法总结
2014/08/29 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
vscode 远程调试python的方法
2017/12/01 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
就业意向书范本
2015/05/11 职场文书
2019年思想汇报
2019/06/20 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
asyncio异步编程之Task对象详解
2022/03/13 Python
windows server2008 开启端口的实现方法
2022/06/25 Servers
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript