php递归内存,php递归导致内存不够

$user = 'root';$pass = 'thrope';$dbh = new PDO('mysql:host=localhost;dbname=income', $user, $pass);$query = 'insert into picinfo set picpath=:pp, picsize=:ps';//把文件路径和文件大小写入数据库$stmt = $dbh->prepare($query);function dir_read($dir){$dh = opendir($dir);//if (is_dir($dir)) echo realpath($dir).'

';while (false !== ($filename = readdir($dh))){//echo realpath($dir.'/'.$filename).'

';//if ($filename == '.' || $filename == '..') continue;if (is_file($dir.'/'.$filename)){global $stmt;$stmt->execute(array(':pp'=>realpath($dir.'/'.$filename), ':ps'=>filesize(realpath($dir.'/'.$filename))));//echo $dbh->errorCode();}if (is_dir(realpath($dir.'/'.$filename)))//这个递归调用特别耗费资源dir_read(realpath($dir.'/'.$filename));}closedir($dh);}dir_read('K:/project/fileOperate');

上面的代码主要功能是把K:/project/fileOperate这个目录下所有的文件和子文件夹下所有的文件名和文件大小写入数据库中,但是这个递归太耗费资源了,占用了超过1G内存

我想请教是我什么地方做得有问题?或者有更好的方法?

回复讨论(解决方案)

之前xu版主的一个方法在这里借用一下

if(is_dir($res[$i])){

$res=array_merge($res,glob($res[$i].'/*'));

$g=glob($res[$i].'/*');

var_dump($g);

}

}

?>

你 为什么把 if ($filename == '.' || $filename == '..') continue; 注释掉?

当 $filename = '.' 和 $filename = '..' 时,is_dir(realpath($dir.'/'.$filename) 成立,不就产生死循环了吗?

其实用 glob 函数 或 目录迭代器要简单的多

这边递归耗内存应该是mysql的insert操作耗内存比较严重, 可以考虑使用load data infile 这种方式优化一下。。

if ($filename == '.' || $filename == '..') continue; ?句是必?有的,否??死循?。

用PHP自带的SPL库处理会快很多:例如

$iterator = new \RecursiveIteratorIterator(new RecursiveDirectoryIterator('./'));

foreach ($iterator as $it){

echo $it->getFilename(),'->',$it->getSize(),'

';

}

可以自己参考下手册,SPL还是封装的蛮好的

memory_get_peak_usage

我用这个函数分别测试了空脚本和你的代码运行于一个全是零碎文件的8.4G的D盘,结果相差无几

有点搞不懂了

1G也太恐怖了吧,楼主还是想想别的办法吧

感觉LZ的代码有问题哇 应该把那个判断是不是当前和上级目录的加进来,这个样子应该就不会有那么大的内存占用了

if ($filename == '.' || $filename == '..') continue;

这个要加上。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值