PHP使用pcntl_fork实现多进程下载图片的方法
本文实例讲述了PHP使用pcntl_fork实现多进程下载图片的方法。分享给大家供大家参考。具体分析如下:
PHPpcntl_fork—在当前进程当前位置产生分支,子进程,译注:fork是创建了一个子进程,父进程和子进程都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0.
注意:PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展.
1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令,代码如下:
#mkdirphp #cdphp #apt-getsourcephp5 #cdphp5-(WHATEVER_RELEASE)/ext/pcntl #phpize #./configure(注一) #make #makeinstallphpize命令是用来准备PHP外挂模块的编译环境的
成功的安装将建立extname.so并放置于PHP的外挂模块目录中(预设存放于/usr/lib/php/modules/内),需要调整php.ini,加入extension=extname.so这一行之后才能使用此外挂模块.
例:
voidpcntl_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($cmdsas$cmd){ $pid=pcntl_fork(); if($pid==-1){ //进程创建失败 echo'创建子进程失败时返回-1'; exit(-1); } elseif($pid){ //父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status,WNOHANG); } else{ //子进程处理逻辑 sleep(5); pcntl_exec('/usr/bin/php',$cmd); exit(0); } }
例,实例多图片同步下载,代码如下:
#!/usr/bin/php <?php //需要抓取的网页地址 $url='https://www.nhooo.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($matchesas$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"; /** *抓取网页图片 * */ functiondownload($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); } /*Endoffilepcntl_fork.php*/ ?>
希望本文所述对大家的PHP程序设计有所帮助。