21,887
社区成员
发帖
与我相关
我的任务
分享
function traversing($path)
{
$curr = glob($path.'/*');
if($curr)
{
foreach($curr as $f)
{
if(is_dir($f))
{
traversing($f);
}
elseif(strtolower(substr($f, -4))=='.jpg')
{
$dosql->ExecNoneQuery("INSERT INTO `#@__uploads` (path) VALUES ('$f')");
}
elseif(strtolower(substr($f, -4))=='.gif')
{
$dosql->ExecNoneQuery("INSERT INTO `#@__uploads` (path) VALUES ('$f')");
}
elseif(strtolower(substr($f, -4))=='.png')
{
$dosql->ExecNoneQuery("INSERT INTO `#@__uploads` (path) VALUES ('$f')");
}
elseif(strtolower(substr($f, -5))=='.jpeg')
{
$dosql->ExecNoneQuery("INSERT INTO `#@__uploads` (path) VALUES ('$f')");
}
}
}
}
traversing('upload');
#获取有用到的
select * from uploads a, imgs b where a.path=b,path
#获取没有用到的
select * from uploads a left join imgs b on a.path=b.path where b.id is null
#获取没有用到的
select * from uploads where path not in (select path from imgs)
function traversing($path) {
$p = array($path); //待遍历的目录
for($i=0; $i<count($p); $i++) {
$p = array_merge($p, glob("{$p[$i]}/*", GLOB_ONLYDIR)); //将本级子目录加入待遍历的目录
$a = preg_grep('/\.(jpeg|jpg|png|gif)/i', glob("{$p[$i]}/*")); //读取本级目录列表,并过滤出图片文件名
$v = join("'),('", $a);
$sql = "INSERT INTO `#@__uploads` (path) VALUES ('$v')"; //构造批量插入指令
$dosql->ExecNoneQuery($sql);
}
}
在递归写法中,每一层读取的目录列表($curr)所占的内存,要等到本层返回时才会被释放
这显然是很耗内存的
一条条的判断、插入,也不如批量插入来的快function traversing($path) {
$p = array($path); //待遍历的目录
for($i=0; $i<count($p); $i++) {
$p = array_merge($p, glob("{$p[$i]}/*", GLOB_ONLYDIR)); //将本级子目录加入待遍历的目录
$a = preg_grep('/\.(jpeg|jpg|png|gif)/i', glob("{$p[$i]}/*")); //读取本级目录列表,并过滤出图片文件名
foreach(array_chunk($a, 50) as $t) {
$v = join("'),('", $t);
$sql = "INSERT INTO `#@__uploads` (path) VALUES ('$v')"; //构造批量插入指令
$dosql->ExecNoneQuery($sql);
}
}
}
这是一次性工作,要休息干什么?