php 如何能让代码一个一个执行而不占用cpu和内存呢?

是这样的,我想遍历网站下的uploads文件夹下多个目录(按日期文件夹存放着图片)里面的图片,可能有5、6千张图片,遍历的时候一个一个的插入到我指定的mysql数据表中,我下面这样写会卡一会,有没有更好的办法或者写法呢?能让程序遍历100条后提示文字,即将继续。。。然后又接着遍历,能做到那样吗?

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’);

回复讨论(解决方案)

才几千条,先扫描后入库,很快的

换个写法,不用递归
function traversing($path) {
$p = array($path); //待遍历的目录
for($i=0; $iexecnonequery($sql);
}
}

在递归写法中,每一层读取的目录列表($curr)所占的内存,要等到本层返回时才会被释放

这显然是很耗内存的

一条条的判断、插入,也不如批量插入来的快

换个写法,不用递归
function traversing($path) {
$p = array($path); //待遍历的目录
for($i=0; $iexecnonequery($sql);
}
}

在递归写法中,每一层读取的目录列表($curr)所占的内存,要等到本层返回时才会被释放

这显然是很耗内存的

一条条的判断、插入,也不如批量插入来的快

目录文件少的可以,文件多的目录没有遍历进去,这是为什么呢?第一个文件夹的能入库,第二个文件夹的不能入库。

php 如何能让代码一个一个执行而不占用cpu和内存呢?0

php 如何能让代码一个一个执行而不占用cpu和内存呢?1

php 如何能让代码一个一个执行而不占用cpu和内存呢?2

文件太多了!

可用 array_chunk 将数组切成小段,分别处理

文件太多了!

可用 array_chunk 将数组切成小段,分别处理

array_chunk 不懂怎么切呢,可以让代码休息10秒后继续的办法吗?感觉那样没那么占内存。

function traversing($path) {
$p = array($path); //待遍历的目录
for($i=0; $iexecnonequery($sql);
}
}
}这是一次性工作,要休息干什么?

function traversing($path) {
$p = array($path); //待遍历的目录
for($i=0; $iexecnonequery($sql);
}
}
}这是一次性工作,要休息干什么?

终于可以了,感谢版主。其实我是想做本地图片文件与数据库对比,然后找出不存在的,删除,这样的一个功能。

上次你告诉我将读到的图片名保存到数据库,然后用 sql 指令完成比较。

我现在把本地的所有图片存到数据库uploads表了,与数据库的另一个表imgs表,对比,它们2个表的结构是一样的,只有id 和 path 2个字段。有最快的指令完成比较吗?

我现在是这样比较的

if(!strpos($imgs[‘path’],$uploads[‘path’]))

{

…//不同的显示在这里。

}

这样的对比我发现感觉也没那么快,还有其他办法吗。

使用预执行sql,应该会好很多,比如pdo的prepare()

Posted in 未分类