<?php
namespace app\admin\controller;
use think\Controller;
use think\Db;
class System extends Allow {
protected $files;
public function doClearPic(){
ini_set('max_execution_time',0);
ini_set('memory_limit','256M'); //升级为256M内存
$type=input('type');
if($type==1){
// 清理文章内容里面的图片
$this->rFile(ROOT_PATH."public".DS."static/admin/image/editor");//调用,要遍历的目录
array_pop($this->files);//删除数组中的最后一组元素
$jpgfile = array_reduce($this->files, function ($jpgfile, $value) {
return array_merge($jpgfile, array_values($value));
}, array());//把二维数组变成一维数组
//表articles里所有图片
$articles = Db::name('articles')->where('body like "%<img %"')->column('body');
$pics = [];
$reg = '/<img (.*?)+src=[\'"](.*?)[\'"]/i';
foreach ($articles as $pic){
preg_match_all( $reg , $pic , $result );//匹配body中的img
$pics = array_merge_recursive($pics, $result[2]);//获取img中的src后把两个数组合并成一个数组
}
//循环数据库图片后添加绝对路径,替换成/,去掉//
for ($i=0; $i < count($pics); $i++) {
$pics[$i]=ROOT_PATH.$pics[$i];
$pics_xiexian[$i]=str_replace("\\",'/', $pics[$i]);
$pics_xiexian[$i]=str_replace("//",'/', $pics_xiexian[$i]);
}
//循环图片文件,查询图片文件是否在数据库中的图片路径中
for ($i=0; $i < count($jpgfile); $i++) {
$xiexian=str_replace("\\",'/', $jpgfile[$i]);
// 如果图片文件路径不在数据库图片路径数组中就删除图片
if(!in_array($xiexian, $pics_xiexian)){
unlink($jpgfile[$i]);
}
}
return json(['code'=>1000,'msg'=>'清理成功','data'=>'']);
}
}
//目录中的图片循环获取图片路径数组
public function rFile($p){
global $file_a;
$file_a=array();
$handle=opendir($p);
$dir_a=array();
while ($file = readdir($handle)) {
if($file!="." && $file!=".."){
$tmp=$p."/".$file;
if(is_dir($tmp)){
if(count(scandir($tmp))==2){//目录为空,=2是因为.和..存在
rmdir($tmp);// 删除空目录
}
$dir_a[count($dir_a)]=$tmp;
}elseif(is_file($tmp)){
$file_a[count($file_a)]=$tmp;
}
}
}
closedir($handle);
foreach($dir_a as $v){
$this->rFile($v);
}
$this->files[]= $file_a;
}
}
?>
上一篇:tp5中phpmail插件的使用
下一篇:php二维数组获取指定的数据