glob函数是否需要在具有10.000个jpeg文件的文件夹上使用大量物理内存?

时间:2014-04-18 00:48:47

标签: php

我注意到cPanel托管环境中的物理内存使用率很高。 为了显示一些符合某些标准的照片,我在10.000 jpeg的目录中大量使用了glob函数。

这可能是原因吗?

谢谢

这是我的代码

<?php   

$glob = glob("imgs/".$id."*.jpg");      
if (empty($glob)) { echo'none'; } 

else {          
    foreach ($glob as $img) {

 echo $img; } 
} 
?>

2 个答案:

答案 0 :(得分:1)

是的,这是可能的。你拥有的数组越大,php消耗的内存就越多,直到达到max_memory限制,这将破坏你的代码。而不是全局使用readdir而不会消耗太多:

if ($handle = opendir('/path/to/files')) {
    while (false !== ($entry = readdir($handle))) {
        $ext = strtolower(end(explode('.', $entry)));
        // Check for extension, first 4 characters a number and 5th character underscore
        if ($ext == 'jpg' && substr($entry, 0, 5) == ($id . '_')) {
            echo "$entry\n";
        }
    }

    closedir($handle);
}

来源:http://www.php.net/manual/en/function.readdir.php

答案 1 :(得分:1)

是;您可能认为它很慢。

我更喜欢RecursiveDirectoryIterator或DirectoryIterator。

这是一个使用RecursiveDirectoryIterator的演示,它应该打印所有目录中的所有文件,用于指定的根目录。

<?php
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.'), RecursiveIteratorIterator::SELF_FIRST);
foreach($files as $name => $file) {
    echo $name . '<br />';
} 
?>

编辑: 在阅读您的评论后,我找到了一个可能更适合您的解决方案。

<?php
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("."));
$files = new RegexIterator($files,'/^.+\.jpeg$/i',RecursiveRegexIterator::GET_MATCH);

然而,readdir解决方案更快。