利用队列, 进行大量文件批处理
依然以关于图片批量转换成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;
知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。
所谓诚其意者,毋自欺也。