Как можно ускорить фунцкии shuffle($f) или random($f) ?

12
DX
На сайте с 11.07.2009
Offline
81
985

Собственно делаю плагин под ВП и часто использую функцию чтоб вызвать случайную строку из файла strochka.txt

PHP код:

function ra($f)

{

$f=file($f);
shuffle($f);
$f[0] = str_replace("\r\n", "", $f[0]);
return $f[0];
}

И естественно при частом обращении к этой функции скрипт начинает медленно работать, но ведь я обращаюсь постоянно к одному и тому же файлу function ra("strochka.txt"). Можно ли как-то это ускорить, кешировать.. или что-то в этом роде ?

sashka_
На сайте с 27.01.2010
Offline
103
#1

можно так сделать


{
$f=file($f);
$z = str_replace("\r\n", "", $f[rand(0,count($f)-1))]);
return $f[0];
}

а вообще скрипт явно работает медленно не из за этого кода.

Знаю PHP, JS, jQuery. Помощь для вашего сайта. (/ru/forum/840509).
N
На сайте с 06.05.2007
Offline
419
#2

записать все эти строки в базу, выбрать случайное число от 1 до N и считать соответствующую строчку?

Кнопка вызова админа ()
Unsiker
На сайте с 23.03.2009
Offline
43
#3

зачем каждый раз его перемешивать функцией shuffle? сделай перемешку 1 раз результаты сохрани в отдельный файл strochka_temp.txt и юзай его. потом когда он станет ненужным удали.

Мне трудно теперь сохранить реальность улыбки, Еще труднее быть с кем-то самим собой.
DX
На сайте с 11.07.2009
Offline
81
#4
Unsiker:
зачем каждый раз его перемешивать функцией shuffle? сделай перемешку 1 раз результаты сохрани в отдельный файл strochka_temp.txt и юзай его. потом когда он станет ненужным удали.

Нужно чтоб каждый раз выдавало случайную строку

AlikZP
На сайте с 22.11.2009
Offline
107
#5

Попробуйте так:


$f = file($filename);
$line = rand(0, sizeof($f) - 1);
return $f[$line];

UPD. Я проверил и поправил некоторые ошибки. Работает такой вариант. Выдает случайную строку из $filename

Website CMS: быстрая, удобная, недорогая! Вечная лицензия за 45$ (/ru/forum/524503) Яся - быстрый поиск фото для товаров. OpenCart/ocStore. Дополнение. (/ru/forum/665287) Грамотная верстка ваших макетов (/ru/forum/comment/8853216)
A
На сайте с 29.12.2007
Offline
68
#6
DeXtR:
Нужно чтоб каждый раз выдавало случайную строку

1. Храни эти строки в массиве, т.е. файл должен быть примерно таким:

<?php

return array(
'str_1',
'str_2',
'str_3',
...
);

2. Дальше загружаешь этот массив и выбираешь нужную строку рандомом, примерно так:

function ra($filename) {

$arr = required_once($filename);
return $arr[array_rand($arr)];
}
DX
На сайте с 11.07.2009
Offline
81
#7

немного ускорилась работа без использования shuffle

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#8

echo $text[array_rand($text=file("strochka.txt"))];

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
AlikZP
На сайте с 22.11.2009
Offline
107
#9

DeXtR, чего вы к этому shuffle привязались?

Я и LEOnidUKG, показали вам более простой способ. Я в три строки, LEOnidUKG, в одну слепил то же самое :)

Точно так же работать будет

edogs software
На сайте с 15.12.2005
Offline
775
#10
DeXtR:
И естественно при частом обращении к этой функции скрипт начинает медленно работать

Если функция вызывается много раз, реально много, то проблема скорее всего в том, что файл дергается много раз, а не в том что его перемешивают.

Поэтому


function ra($f) {
static $yoyo=array();
if(!isset($yoyo[$f])) {
if(file_exists($f)) $yoyo[$f]=file($f); else $yoyo[$f]=false;
}
if($yoyo[$f]===false) return false;
return $yoyo[$f][mt_rand(0,sizeof($yoyo[$f])-1)];
}

А если в файле еще и много строк, тогда есть смысл хранить кэш в базе, в отдельной таблице, возможно memory типа.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий