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 相关文章推荐
腾讯QQ php程序员面试题目整理
Jun 08 PHP
写php分页时出现的Fatal error的解决方法
Apr 18 PHP
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
php递归函数中使用return的注意事项
Jan 17 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
Oct 18 PHP
通过PHP实现获取访问用户IP
May 09 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 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中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
js动态改变select选择变更option的index值示例
2014/07/10 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
js实现扫雷源代码
2020/11/27 Javascript
python中split方法用法分析
2015/04/17 Python
Python的Django框架中settings文件的部署建议
2015/05/30 Python
python操作mysql数据库
2017/03/05 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
python修改FTP服务器上的文件名
2019/09/11 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
GWT都有什么特性
2016/12/02 面试题
酒店公关部经理岗位职责
2013/11/24 职场文书
中学生期末评语
2014/02/03 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
新课程改革心得体会
2016/01/22 职场文书