Мой файл воссоздается каждый день в 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