Действительно ли возможно ускорить рекурсивное сканирование файла в PHP?

Числа взяты из самого Excel, даты хранятся в Excel в виде числовых значений. http://www.cpearson.com/excel/datetime.htm

Для платформы Laravel 5.6 и пакета maatwebsite / excel версии 3.1 для преобразования даты из чисел Excel в обычный формат даты, эта функция PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($dateFromExcel) может быть использована. Он принимает целое число (дата Excel) и возвращает объект DateTime.

Дополнительную информацию можно найти здесь https://github.com/Maatwebsite/Laravel-Excel/issues/1832

blockquote>

Из этого ответа: https : //stackoverflow.com/a/55139981/9133724

9
задан neu242 28 October 2009 в 13:42
поделиться

7 ответов

PHP просто не может работать с такой скоростью, как C, простой и простой.

3
ответ дан 4 December 2019 в 14:31
поделиться

Я не уверен, лучше ли производительность, но Вы могли бы использовать рекурсивный итератор каталога для создания кода более простым... Посмотрите RecursiveDirectoryIterator и 'SplFileInfo'.

$it = new RecursiveDirectoryIterator($from);
foreach ($it as $file)
{
    if ($file->isDot())
        continue;

    echo $file->getPathname();
}
4
ответ дан 4 December 2019 в 14:31
поделиться

Прежде чем Вы начнете изменять что-либо, представите свой код.

Используйте что-то как Xdebug (плюс kcachegrind для симпатичного графика) для обнаружения, где медленные части. Если Вы начнете изменять вещи вслепую, то Вы не доберетесь нигде.

Мой только другой совет уже состоит в том, чтобы использовать итераторы каталога SPL, как отправлено. Разрешение внутреннему C кодировать делает работа почти всегда быстрее.

4
ответ дан 4 December 2019 в 14:31
поделиться

Почему Вы ожидали бы, что интерпретируемый код PHP будет с такой скоростью, как скомпилированная версия C находки? Быть только вдвое более медленным на самом деле довольно хорошо.

О единственном совете я добавил бы, должен сделать ob_start () вначале и ob_get_contents (), ob_end_clean () в конце. Это могло бы ускорить вещи.

2
ответ дан 4 December 2019 в 14:31
поделиться

Вы сохраняете потоки каталога N открытыми, где N является глубиной дерева каталогов. Вместо этого попытайтесь читать ценность всего каталога записей сразу и затем выполните итерации по записям. По крайней мере Вы максимизируете использование стола кэши ввода-вывода.

1
ответ дан 4 December 2019 в 14:31
поделиться

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

function list_recursive($dir) { 
  $dir=escapeshellcmd($dir);
  $h = popen("/usr/bin/find $dir -type f", "r")
  while ($s = fgets($h,1024)) { 
    echo $s;
  }
  pclose($h);
}

Однако там мог бы быть некоторым каталогом, это является настолько большим, Вы не собираетесь хотеть обеспокоиться этим также. Рассмотрите амортизацию замедления другими способами. Ваша вторая попытка может быть отмечена контрольной точкой (например), путем простого сохранения стопки каталога на сессии. Если Вы даете пользователю список файлов, просто собираетесь, pageful затем сохраняют остальную часть состояния на сессии для страницы 2.

0
ответ дан 4 December 2019 в 14:31
поделиться

Попробуйте использовать scandir () для чтения всего каталога сразу, как предложил Джейсон Коэн. Я основал следующий код на коде из комментариев руководства php для scandir ()

 function scan( $dir ){
        $dirs = array_diff( scandir( $dir ), Array( ".", ".." ));
        $dir_array = Array();
        foreach( $dirs as $d )
            $dir_array[ $d ] = is_dir($dir."/".$d) ? scan( $dir."/".$d) : print $dir."/".$d."\n";
 }
0
ответ дан 4 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: