From:             nangnahz at gmail dot com
Operating system: Ubuntu 7.04
PHP version:      5.2.4
PHP Bug Type:     Performance problem
Bug description:  scandir() is much more slower than readdir()

Description:
------------
I try to traversal a directory. Include about 20000 files and 200
directories.

Use scandir function, it cost about 70 seconds.

Then I use readdir function, it cost only 6 seconds!



System Version:
Linux ubuntu 2.6.20-16-generic
Apache/2.2.6
PHP/5.2.4
Mysql/5.0.45




Reproduce code:
---------------
<?php
function useScandir($dir) {
        $i = 0;
        while ($dir) {
                foreach (scandir($dir[0]) as $filename) {
                        if ($filename != '.' && $filename != '..') {
                                $filename = $dir[0] . '/' . $filename;
                                if (is_dir($filename)) {
                                        echo $i . " [dir] " . $filename . 
"<br>";
                                        $dir[] = $filename;
                                } else {
                                        echo $i . " file: " . $filename . 
"<br>";
                                }
                                $i++;
                        }
                }
                array_shift($dir);
        }
}
useScandir(array ("/data/www/manual"));
?>

<?php
function useReaddir($dir) {
        $i = 0;
        while ($dir) {
                $dh = opendir($dir[0]);
                while (false !== ($filename = readdir($dh))) {
                        if ($filename != '.' && $filename != '..') {
                                $filename = $dir[0] . "/" . $filename;
                                if (is_dir($filename)) {
                                        echo $i . " [dir] " . $filename . 
"<br>";
                                        $dir[] = $filename;
                                } else {
                                        echo $i . " file: " . $filename . 
"<br>";
                                }
                                $i++;
                        }
                }
                closedir($dh);
                array_shift($dir);
        }
}
useReaddir(array ('/data/www/manual'));
?>

Expected result:
----------------
run fast!!!

Actual result:
--------------
it's very slow......

-- 
Edit bug report at http://bugs.php.net/?id=42679&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=42679&r=trysnapshot44
Try a CVS snapshot (PHP 5.2): 
http://bugs.php.net/fix.php?id=42679&r=trysnapshot52
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=42679&r=trysnapshot60
Fixed in CVS:                 http://bugs.php.net/fix.php?id=42679&r=fixedcvs
Fixed in release:             
http://bugs.php.net/fix.php?id=42679&r=alreadyfixed
Need backtrace:               http://bugs.php.net/fix.php?id=42679&r=needtrace
Need Reproduce Script:        http://bugs.php.net/fix.php?id=42679&r=needscript
Try newer version:            http://bugs.php.net/fix.php?id=42679&r=oldversion
Not developer issue:          http://bugs.php.net/fix.php?id=42679&r=support
Expected behavior:            http://bugs.php.net/fix.php?id=42679&r=notwrong
Not enough info:              
http://bugs.php.net/fix.php?id=42679&r=notenoughinfo
Submitted twice:              
http://bugs.php.net/fix.php?id=42679&r=submittedtwice
register_globals:             http://bugs.php.net/fix.php?id=42679&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=42679&r=php3
Daylight Savings:             http://bugs.php.net/fix.php?id=42679&r=dst
IIS Stability:                http://bugs.php.net/fix.php?id=42679&r=isapi
Install GNU Sed:              http://bugs.php.net/fix.php?id=42679&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=42679&r=float
No Zend Extensions:           http://bugs.php.net/fix.php?id=42679&r=nozend
MySQL Configuration Error:    http://bugs.php.net/fix.php?id=42679&r=mysqlcfg

Reply via email to