利用队列, 进行大量文件批处理

  依然以关于图片批量转换成webp格式为例, 

  所有的图片都在本地的upload文件夹

  原理: 采用队列而不是递归来批量处理文件, 对内存的占用要小很多, 

  处理了28429个图片,不会提示内存超出

  主要看开头和结尾的数组和目录的关系/ / /

<?php 
set_time_limit(0);//0表示不限时
ini_set("gd.jpeg_ignore_warning", 1); //GD库的错误,
ini_set("gd.png_ignore_warning", 1);  //这行是仿照上一行写的, 应该是不存在这种写法的/

function read_dir_queue($dir){  
    $count = 0;
    $queue=array($dir);  //把要处理的目录放到一个数组中
    while($data=each($queue)){  
        $path=$data['value'];  
        if(is_dir($path) && $handle=opendir($path)){  //如果是目录, 并且是一个合法的资源
            
            while($file=readdir($handle)){  
                if($file=='.'||$file=='..') continue;
                $real_path=$path.'/'.$file;
                //获取文件后缀名
                $ext = strtolower(pathinfo($file,PATHINFO_EXTENSION));
                
                //这里是删除webp
//                 if($ext == 'webp')   //删除这个生成的webp
//                 {
//                     if(unlink($real_path))
//                     {
//                         $count += 1;
//                     }
//                 }  


//根据后缀名把jpg或者png转成webp
//webp开始
                if($ext == 'jpeg' || $ext == 'jpg' || $ext == 'png')
                {
                    //生成新的文件名
                    $newpic = rtrim($real_path,$ext).'webp';
                                
                    if($ext == 'jpeg' || $ext == 'jpg')
                    {
                        $hImg = imagecreatefromjpeg($real_path);
                    }
                    if($ext == 'png')
                    {
                        $hImg = imagecreatefrompng($real_path);
                    }
                    //如果是jpg或者png,并且是能利用的资源
                    if($hImg)
                    {
                        imagewebp($hImg,$newpic);  //用这个图片资源创建一个webp图片, 存在路径$newpic
                        imagedestroy($hImg);     //销毁画布资源
                        $count += 1;             //计数用的. 可删除
                    }
                    
                }
//webp结束              
                if (is_dir($real_path)) $queue[] = $real_path;  //把新发现的目录放到队列中.
            }  
        }  
        closedir($handle);  
    }  
     return $count;  
}  
print_r(read_dir_queue('./upload'));exit;  

 

posted @ 2017-10-23 14:34  _Eternity味道  Views(912)  Comments(0Edit  收藏  举报