zoukankan      html  css  js  c++  java
  • 利用队列, 进行大量文件批处理

      依然以关于图片批量转换成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;  
  • 相关阅读:
    剑指offer--26.顺时针打印矩阵
    剑指offer--25.二叉树的镜像
    剑指offer--24.树的子结构
    剑指offer--23.合并两个排序的链表
    剑指offer--22.反转链表
    剑指offer--21.链表中倒数第k个结点
    剑指offer--20.矩形覆盖
    剑指offer--19.重建二叉树
    剑指offer--18.从尾到头打印链表
    剑指offer--17.第一个只出现一次的字符
  • 原文地址:https://www.cnblogs.com/lz0925/p/7716628.html
Copyright © 2011-2022 走看看