Как в PHP быстрее и с меньшей нагрузкой на сервер вывести случайное значение сроки с 500000 шт?

Есть много сайтов где нужно вывести на страницах случайную строку с наименьшей нагрузкой и как можно быстрее!
Как в PHP быстрее и с меньшей нагрузкой на сервер вывести случайное значение сроки с 500000 шт?
подскажите сам метод желательно бд. Например есть пол миллиона строк .
1) залил каждую строку в файл txt и рандом вывод
$file = file ("/str/" . mt_rand (1,500000) . ".txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); echo $file[0];
2) все строки в масив подключить (include) файл с этим большим масивом и вывести где надо echo array_rand( $str, 1);
и тп.
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Способ с инклюде - это ад кромешный. Память процесса РНР- она как бы не бесплатная. И даже если в моменте ничего не упадёт, то может потом не хватить на какую-то другую операцию. Но главное - это просто варварство, каждый раз тягать в память пол-ляма строк ради того чтобы вывести одну.
Способ с файлами в принципе эффективен, но многие ос начинают тупить при большом количестве файлов в каталоге, придется разбивать по 500 подкаталогам. В целом гемор.
spoiler
И непонятно, зачем так сложно писать
echo file_get_contents("/str/" . mt_rand (1,500000) . ".txt");

Самый простой способ - это действительно сделать таблицу в БД, где будет два поля, число по возрастанию (первичный индекс) и собственно значение строки.
и выбирать по первому полю через то же mt_rand (1,500000)

Сразу отвечу на вопрос про разницу с гениальным решением через инклюде: индекс в БД будет во-первых занимать память только под первую колонку, а во-вторых, этот индекс будет храниться ровно в одном экземпляре. А не занимать память в каждом процессе РНР.
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Можно считать нужную строку из файла без загрузки всего файла в память используя смещение
$file = new SplFileObject('myfile.txt');
$file->seek(9999);     // строка 10000
echo $file->current();
Ответ написан
Комментировать
@402d
начинал с бейсика на УКНЦ в 1988
key-value хранилище в оперативной памяти. И без пыха. Например сам nginx запрашивает.

Если дешево и сердито. То воспользоваться механизмом кеширования опкодов php в памяти.
Тупо PHP скрипт с 500к элементов массива.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы