2012-02-20 4 views
-1

У меня есть следующее, что довольно медленно. Как я могу ускорить его?Оптимизация кода чтения файла php

(он сканирует каталог и делает заголовки из папки • и извлекает файлы в формате PDF изнутри и добавляет их к спискам)

$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>"; 
    } 
+0

как вы определили, что это медленно? –

+0

Потому что запуск занимает некоторое время. –

+0

эй, почему минус 1? –

ответ

2

Я не уверен, как быстро array_diff(), когда массив очень большой, не быстрее ли просто добавить отдельную проверку и убедиться, что «.» и '..' не является возвращенным именем?

Помимо этого, я не вижу, что что-то действительно не так.

Что вы проверили, чтобы считать текущий подход медленным?

3

Не используйте array_diff() для фильтрации текущей и родительской директории, используйте что-то вроде DirectoryIterator или glob(), а затем проверьте, есть ли это. или .. через если заявление

Glob() имеет флаг, который позволяет извлекать только каталоги для петель

профиль кода, чтобы увидеть именно то, что линии/функции выполняются медленно

0

Вот фрагмент кода, который я использую, который я адаптировал из php.net. Он очень простой и проходит через данный каталог и перечисляет файлы, содержащиеся внутри.

// 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 
} 

Вы можете приспособить это дополнительно к рекурсии над подкаталогами с помощью is_dir, чтобы определить папки, как я показал выше.

+0

Спасибо за подсказку. хотя я искал больше прямого ответа –

Смежные вопросы