Случайная строка из текстового файла большого размера.
Довольно часто бывает необходимость получить случайную строку из файла огромного размера (ну, например из списка прокси-серверов в полмиллиона строк), [ну а что - бывает и такое
] … При этом использование таких функций как file() – [возвращает массив строк], или file_get_contents() – [возвращает строку] – ни в коем случае не рекомендуется , так как можно забить всю оперативку, либо, в лучшем случае, получить отлуп по memory_limit в настройках PHP .
Предлагаю код, который поможет решить данную проблему.
Код работает с текстовым файлом практически любого размера (миллионы строк)…
Разбор кода:
<?php
//открываем файл для чтения
$proxyfile=fopen (‘./proxies.txt’, ‘r’);//ставим указатель в конец файла
fseek($proxyfile, 0, SEEK_END);// получаем размер файла (для файлов огромного размера filesize() может не работать)
$len = ftell($proxyfile);// Генерим случайное число в диапазоне от нуля до размера файла (минус 20 добавлено, чтоб не попасть в самый конец файла)
$posrand=mt_rand(0, $len)-20;// Перемещаем указатель в случайную позицию
fseek($proxyfile, $posrand);// получаем строку, на которую мы попали указателем (строка может быть неполной, так как случайная позиция указателя может быть в любом месте строки)
$line = fgets($proxyfile);// Возвращаем следующую строку, которая уже точно будет полной и применяем к ней trim()
$proxy= trim(fgets($proxyfile));//закрываем файл
fclose($proxyfile);
?>
Рассмотрим функции, которые были использованы:
- fopen – открывает файл (в нашем случае – только для чтения)
- fclose – закрывает файл
- fseek – Устанавливает смещение в файловом указателе (или, простым языком, – двигает курсор)
- ftell – Сообщает текущее смещение чтения/записи файла
- mt_rand – генерирует псевдослучайное число (ибо ничто в этом мире не бывает случайным
) - fgets – Читает строку из файла
- trim – Удаляет “мусор” из начала и конца строки
Как видим, PHP богат библиотечными функциями для работы с текстом на любой вкус
Желаю удачи, и, как обычно, жду вопросов и пожеланий…





Добавить комментарий
Вы должны войти