PHP编程:PHP使用pcntl_fork实现多进程下载图片的方法
《PHP使用pcntl_fork实现多进程下载图片的方法》要点: PHP应用本篇章节讲解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 = ''; $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使用pcntl_fork实现多进程下载图片的方法》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |