Всем привет) Подскажите пожалуйста, как можно оптимизировать этот код: PHP: <?php $file_array = file("links.txt"); $max_colichestvo = count($file_array); $sluchainiy_link = rand(0, $max_colichestvo); print $file_array[$sluchainiy_link]; ?> Говорят я им положил сайт. Его назначение, это выводить на сайте каждый раз при перезагрузке страницы, другую ссылку. Ссылок в файле более 8000. Я думаю, что система грузиться массивом из 8000 элементов. Наверное нужно как то просто подсчитать соличество строк в файле, затем, рандомно выбрать строку и открыть файл и вытащить только эту строчку. Но что то не пойму, ведь все равно придется использовать функцию file() и получается опять массив создается из 8000. Что то я подзапутался, можете помочь направлением?
PHP: <?php $array = file ('filename.txt'); echo $array[array_rand (file ('filename.txt'))]; , но не думаю, что на скорость это повлияет, количество строк будет меньше...
Мне скорость не очень важна, главное строк чтоб было меньше. Но здесь опять массив в переменной $array у Вас, опять туда залетят все 8000 строк из файла, у меня посещаемость высокая несколько сотен тысяч уников, и для каждого формируется 8000 строк в массиве. Это как то не очень хорошо. Может еще есть варианты?
Mr. T Тут как раз затратная операция - чтение из файла. А ты её 2 раза выполняешь. PHP: <?php $file_array = file("links.txt"); echo array_rand($file_array); viv В случае работы с файлом - никак. Медленная операция - именно чтение.
Можно придумать что-то типа 1) читаем файл полностью. 2) выбираем с помощью array_rand($file_array, 100) - например 100 случайных строк. 3) складываем в еще один файл. 4) из этого файла читаем только 1 строку, и её удаляем 5) если этот доп файл пустой - повторяем с шага 1
tommyangelo, так и есть, сразу написал в одну строку неверно, потом правил, но видно не заметил Лучше тут все же завести таблицу в БД, один раз записать в нее данные и дальше работать с ней. Я за БД...
Да в бд конечно лучше)) Только этот код мы отдаем партнерам, которые на своих сайтах размещают. А они не хотят в базу заносить(( Вот и приходится плясать. А можно попробовать вот так: к примеру использовать рандомный fseek. Найти возврат каретки $position. Вывести все символы от $position до конца строки (опять ищем возврат каретки) Что Вы про это думаете?
Попробовал несколько вариантов: 1) PHP: <?php $fp = fopen('links.txt', 'r'); $rand = rand(0, 81314); while ($fp){ $link = fgets($fp); $k++; if($k==$rand) { print_r($link); flush(); exit(); fclose('links.txt'); } $d = 0; fseek($fp, 0, SEEK_CUR); } ?> 2) PHP: <?php $file_array = file("links.txt"); $e = array_rand($file_array); print $file_array[$e]; ?> 3) PHP: <?php $file_array = file("links.txt"); $max_colichestvo = count($file_array); $sluchainiy_link = rand(0, $max_colichestvo); print $file_array[$sluchainiy_link]; ?> Результат: 1) Всех больше загрузил процессор на компе, а 2) и 3) почти одинакого работают. Почему 1й вариант нагружает проц? Ведь я не создаю массив, а только пробегаю по файлу. Может я не правильно воспользовался функцией fseek?
Не слушай их. Тести PHP: <?php $fname = 'data.txt'; $f = fopen( $fname, 'r' ); // fseek( $f, rand(0,filesize($fname)-1) ); fgets( $f ); do { if( fEoF($f) ) fseek( $f, 0 ); $result = fgets( $f ); } while( trim($result)=='' ); echo $result;
Спасибо за код Ни как все его не протестю, со временем напряжно стало ((, но обязательно попробую и отпишусь о результатах.
Mamont Спасибо дружище, код работает просто супер! Осталось только протестировать на боевом сервере) И жаль конечно, что у самого не получилось
Я бы сделал так. Файл с данными сделал бы типа двумерного массива, ширина которого - максимально нужное количество символов в строке. Если в какой-то строке запись меньше макс. ширины, то остаток заполнять пробелами. Файл получится большим, но с предсказуемыми позициями. В отдельном файле хранить количество записей. Всего одно число. Сначала прочитать его, найти rand-омное число. Затем умножением числа на на макс. ширину находим позицию начала строки в файле данных. Далее, как обычно с помощью fopen(), fseek() и fgets() читаем строку и удаляем пробелы с помощью rtrim().