Intereting Posts
Дата вставляется как 0000-00-00 00:00:00 в mysql PHP: конвертировать любую строку в UTF-8 без знания исходного набора символов или, по крайней мере, попробовать Чтение данных сеанса PHP в node.js Вызовите некоторый JavaScript, когда пользователь закрывает окно (всплывающее окно) Невозможно изменить значение xml с помощью PHP PHP: Предупреждение: sort () ожидает, что параметр 1 будет массивом, ресурс указан Как фильтровать мужской и женский идентификатор в графике Facebook api Лучшая древовидная структура php / Mysql Вызов любой php-функции с помощью общего javascript ajax без jQuery Не удалось выбрать поле LastLogin из таблицы общих клиентов volusion store Удалить cookie из браузера? Как удалить все экземпляры дублированных значений из массива Игнорирование сообщения об ошибке сервера при использовании Yii CMemCache Получение ошибки: NotReadableException в строке AbstractDecoder.php 302 Перезаписать родительские функции в child function.php WordPress

Как улучшить чтение функции файла и захватить данные для лучшей производительности, чем файл ()?

Мой файл воссоздается каждый день в 00:00, и он начинает медленно в течение дня добавлять строки по строкам в качестве файла журнала. Файл составляет приблизительно 1 мб и с примерно 6000 строк в конце дня. Таким образом, это не очень маленький файл. Мой вопрос заключается в том, как я могу сделать скрипт более эффективной, потому что file() читает весь файл на самом деле линии по строкам, так что лучший способ сделать это? Файл является открытым текстом в формате .txt, и это пример строки из файла:

 1,42,16, 201,stackoverflow_user, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_user, 2, 1351147, 1165, 483259, 1351147, 1115, 241630, 0 1,46,27, 201,[stackoverflow_user | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,stackoverflow_user, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0 

Моя функция:

 # read a file into an array $lines = file('C:/path/to/file.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); # flip our array over so the last lines of the file are first. $lines = array_reverse($lines); $n = 1; $wanted = 21; # or however many lines you want. $content = ''; foreach ($lines as $l) { # treat the data as comma-separated values $arr = explode(",", $l); # if col 5 has multiple values, take the first one if (preg_match("/\[(.+?) \|/", $arr[4], $matches)) { $arr[4] = $matches[1]; } # is arr[4] the same as arr[12]? if ($arr[4] !== $arr[12]) { # these two are not equal, so use these values $data = array('rank-pos' => $n++, 'rank-name' => $arr[4], 'rank-dmuser' => $arr[12]); $content .= Template::Load('rankinguserdm-' . ($n % 2 == 1 ? 2 : 1), $data); } # have we got enough data? if ($n === $wanted) { break; } } $this->content = Template::Load('user_rankingsdm', array('rankings' => $content)); } 

Я немного настроил код вопроса для производительности. На моем сервере инвертирование массива занимает около 0,7 мс, в то время как цикл требует около 0,2 мс. поэтому $lines = array_reverse($lines); в приведенном ниже решении.

 <?php for ($i=0; $i<1000;$i++) { $lines[] = '1,42,16, 201,stackoverflow_user, 1, 6762160, 39799, 9817242, 6762160, 39884, 10010545,stackoverflow_user, 2, 1351147, 1165, 483259, 1351147, 1115, 241630, 0'; $lines[] = '1,46,27, 201,[stackoverflow_user | stackoverflow_userother], 1, 4078465, 286991, 1594830, 4078465, 287036, 1643156,stackoverflow_user, 2, 1357147, 1115, 241630, 1357147, 1065, 120815, 0'; } $lines_count = count($lines) - 1; $content = []; for ($i=$lines_count; $i > $lines_count - 21; $i--) { $l = $lines[$i]; $content[] = $l; } print_r($content); 

рабочий пример: https://eval.in/207364