Помогите подправить код (php)

Wolya
На сайте с 08.11.2007
Offline
52
493

Смысл кода заключается в случайном выводе строк из файла в 2 местах. Код работает, но страшно грузит сервер=))

Первый вывод:

<?php $file_name = "1.txt";

$f = file($file_name);

$n = rand(0,count($f)-1);

$rstr1 = trim($f[$n]);

$exstr = explode('=', $rstr1);

echo "$rstr1"; /* 1 */

?>

второй:

<?php echo "$rstr1"; /* 1 */ ?>

может можно его как-то подправить??

Едет вебмастер в поезде и слышит: … … Car Insurance (http://zibydream.com/)
C
На сайте с 28.01.2010
Offline
70
#1

А какой размер файла?

И для чего explode, если в итоге выводится полная строка?

Это - личная подпись. Здесь обычно ставят ссылки на всякие кривые сайты, надеясь получить "жирный бек".
C
На сайте с 04.02.2005
Offline
277
#2

какой размер файла 1.txt?

зачем вот эта строка?

$exstr = explode('=', $rstr1);

(я понимаю, что $exstr может еще где-нибудь использоваться)

Может в файл 1.txt кто-то пишет, возникают коллизии доступа.

Wolya
На сайте с 08.11.2007
Offline
52
#3

1.тхт до 1 мб. Просто интересно ,нет ли ошибок в коде?

WS
На сайте с 17.11.2010
Offline
25
#4
Wolya:
echo "$rstr1";

Используйте просто echo $rstr1;

WhiteSmartFox добавил 18-02-2011 в 16:33

Wolya:
$exstr = explode('=', $rstr1);

Если не надо удалите.

WhiteSmartFox добавил 18-02-2011 в 16:33

Wolya:
1.тхт до 1 мб

Файл 1 мб это слишком много, мало того что прочитать 1Мб долго + каждый процесс будет резервировать 1-2Мб'ний массив => что тоже не быстрое занятие, да и память кстати ограниченный ресурс.

unixadm
На сайте с 24.09.2010
Offline
110
#5

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

Host4Biz: NVMe Хостинг в Европе ( https://host4.biz/ru/hosting/shared-hosting ) | Windows/Linux NVMe VPS в Европе ( https://host4.biz/ru/vps ) | Выделенные серверы в Европе, США и Азии ( https://host4.biz/ru/servers/dedicated )
Posting_i_PIAR
На сайте с 03.02.2008
Offline
204
#6

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

Услуги наполнения форумов (/ru/forum/882326) | групп ВК (https://smo-i-seo.ru/napolnenie-grupp-vkontakte) | комментирование (https://smo-i-seo.ru/posting-kommentirovanie-blogov) Копирайтинг (https://smo-i-seo.ru/uslugi-kopirajtinga) Настройка Директа (https://smo-i-seo.ru/zakazat-nastroyku-yandeks-direkt)
Subudayj
На сайте с 24.06.2008
Offline
67
#7

Можно так попробовать:

$file_cont = file("1.txt");

$rand_line = $file_cont[array_rand($file_cont)];

Quo vadis?
WS
На сайте с 17.11.2010
Offline
25
#8
Wolya:
Смысл кода заключается в случайном выводе строк из файла в 2 местах. Код работает, но страшно грузит сервер=))

Может тогда переделать алгоритм, типа

<?php 
$file_name = "1.txt";
$len = 300; // Это максимальный код строки * 2
$file = fopen($file_name,"r");
flock($file, LOCK_SH);
$size = fstat($file);
$n = rand(0,$size);
fseek($file,$n);
$str = fread($file,$len);
flock($file, LOCK_UN);
fclose($file);
$tmp = explode("/n", $str1."/n");
echo $tmp[1];
?>

Это код также выведет случайную строчку, правда немного изменится вероятность (чем больше строка, тем более вероятно что она будет выведена) + Есть некоторая вероятность что последняя строка может вывестись не полностью. Зато этот код не будет читать больше максимального размера строки * 2.

P.S. Можно создать дополнительный файл в который будет записывается размер начальный и конечный индекс строк при каждом обновлении 1.txt, при этом можно получать строку намного проще т.е. есть файл 1.txt вида

Привет Мир

Привет Мир!Ура!

создать для него доп файл 1.ind вида (средствами php конечно)

00000 00010

00012 00015

...

в коде при чтении будет что-то вида (не проверял)


$file = fopen('1.ind',"r");
$size = fstat($file);
$n = rand(0,$size/13);
fseek($file,$n*13);
$str = fread($file,11);
$tmp = explode(' ', $str1);
fclose($file);
$file1 = fopen('1.txt',"r");
fseek($file1,$tmp[0]);
$str = fread($file1,$tmp[1]);
fclose($file1);
echo $str;
C
На сайте с 28.01.2010
Offline
70
#9

<?php
$fhandle = fopen('1.txt', 'r');
fseek($fhandle, 0, SEEK_END);
$length = ftell($fhandle);
$position = mt_rand(0, $length)-20;
fseek($fhandle, $position);
$line = fgets($fhandle);
$line = fgets($fhandle);
fclose($fhandle);
echo $line;
?>

Смысл такой, получаем размер файла, получаем случайное число от 0 до размера файла, перемещаем указатель в файле на полученную случайную позицию. Получаем строку в указанной позиции (там идет два раза $line = fgets($fhandle); - это не опечатка, т.к. первая полученная строка может быть не полной, читаем следующую).

Работает с файлами любого размера, не занимает кучу памяти. Минус - чем меньше строк в файле, тем больше шанс попасть на последнюю строку и прочитать ее не полностью (следующей строки не будет). Для предотвращения этого там стоит -20, можно увеличить до максимальной длины строки.

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