简体   繁体   中英

Optimising php file reading code

I have the following which is fairly slow. How can I speed it up?

(it scans a directory and makes headers out of the foldernames and retrieves the pdf files from within and adds them to lists)

$directories= array_diff(scandir("../pdfArchive/subfolder", 0), array('..', '.'));
  foreach ($directories as $v) {
    echo "<h3>".$v."</h3>";
    $current = array_diff(scandir("../pdfArchive/subfolder/".$v, 0), array('..', '.'));
    echo "<ul style=\"list-style-image: url(/images/pdf.gif); margin-left: 20px;\">";
    foreach ($current as $vone) {
      echo "<li><a target=\"blank\" href=\"../pdfArchive/subfolder/".$vone."\">".str_replace(".pdf", "", $vone)."</a>";
      echo "</li><br>";
    }
    echo "</ul>";
  }

Don't use array_diff() to filter out current and parent directory, use something like DirectoryIterator or glob() and then test whether it's . or .. via an if statement

glob() has a flag that allows you to retrieve only directories for your loops

Profile your code to see exactly what lines/functions are executing slowly

I'm not sure how fast array_diff() is when the array is very large, isn't it faster to simply add a separate check and make sure that '.' and '..' is not the returned name?

Other than that, I can't see there being anything really wrong.

What did you test to consider the current approach slow?

Here is a snippet of code I use that I adapted from php.net. It is very basic and goes through a given directory and lists the files contained within.

// The @ suppresses any errors, $dir is the directory path
if (($handle = @opendir($dir)) != FALSE) {
    // Loop over directory contents
    while (($file = readdir($handle)) !== FALSE) {
        // We don't want the current directory (.) or parent (..)
        if ($file != "." && $file != "..") {
            var_dump($file);
            if (!is_dir($dir . $file)) {
                // $file is really a file
            } else {
                // $file is a directory
            }
        }
    }
    closedir($handle);
} else {
    // Deal with it
}

You may adapt this further to recurse over subdirectories by using is_dir to identify folders as I have shown above.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM