Какая конструкция работает быстрее и оптимальнее ?

serg30

Новичок
Нужно выводить рандомно записи из нескольких категорий.

Ранее использовал такую конструкцию

Варинт 1
Инклудил файл

PHP:
$filetime=lstat('files/random_entries.txt'); // Получаем массив информации о файле 
$cur=time()-$filetime[9]; // Получаем время прошедшее с последней модификации файла 
if ($cur>2500) // Если прошло больше 2500 секунд, то делаем запрос к БД 
{ 
$f=fopen('files/random_entries.txt','w');  

// Все echo заменяем на $out.=  
// Чтобы собрать в эту переменную все данные которые надо выводить 

$host = "localhost";    // MySQL server
$user_db = "111111";        // MySQL пользователь
$pass_db = "111111";            // MySQL пароль
$dbase = "222222";        // MySQL база данных
$dtable = "eu_entries";        // Таблица в базе данных

mysql_connect ($host, $user_db, $pass_db); 
mysql_select_db($dbase); 
mysql_query("SET NAMES 'cp1251'");

$sql = "SELECT link_id, images, catid, v_title, v_255_13, v_descr, rand() AS rnd FROM $dtable WHERE ((catid=403)OR(catid=404)) AND images!='' GROUP BY link_id ORDER BY rnd LIMIT 800"; 

$result = mysql_query($sql); 
$rows = mysql_num_rows($result); 
$out=""; 
if ((!$rows) || ($rows < 1)) {$out.="Результатов НЕТ!!!";} 
else { 
      $out.=" "; 
      while(list($id_link,  $images, $catid, $v_title, $v_255_13, $v_descr ) = mysql_fetch_row($result)) { 
$images = explode( "\n", $images ); 
$images = $images[0]; 

      $v_descr=strip_tags($v_descr);
      $v_descr=str_replace('&nbsp;',' ',$v_descr);
      $v_descr=str_replace('.','. ',$v_descr);
      $v_descr=str_replace(',',', ',$v_descr);
      $v_descr=str_replace('(',' (',$v_descr);
      $v_descr=str_replace(')',') ',$v_descr);
      $v_descr=str_replace('  ',' ',$v_descr); 
 

$v_alt=substr($v_title,0,20);
$v_title=substr($v_title,0,26);
$v_descr=substr($v_descr,0,71);
$v_descr=mb_strtolower($v_descr);

       $out.= ""; 
           if(empty($images)) 
             echo ""; 
             else 
            $out.= "<a href=\"page-o$id_link.html\"><img src=\"files/small/$images\" width=\"60\" class=\"imgThum\"></a>";  
            $out.="<div class=\"pdsc\"><a href=\"page-o$id_link.html\">$v_title</a> $v_descr $v_255_13 <span>»</span></div></div>"; 
} 
       } 
$out.=""; 
fwrite($f,$out);fclose($f); // Записываем в файл 
} 
echo file_get_contents('files/random_entries.txt'); // Всегда выводим содержимое файла 

?>
Вариант 2 сделать вывод через функцию

PHP:
function block_RandomEntries_Browse(&$tpl, $args = ''){
 global $db;

  $hw_num = isset($args['amount']) ? abs(intval($args['amount'])) : 10;

  $mass = $db->one_col_array("SELECT link_id FROM ".TBL_AD." WHERE ((catid=403)OR(catid=404)) AND approved='1'  AND user_approved='1' AND images!=''");	

  shuffle($mass);
  
  $tmp = array_slice($mass, 0, $hw_num);
  
  $zap=implode(',',$tmp);
  
 	  $ql = 'SELECT link_id, 
	                v_title  AS f_title,
			v_descr  AS f_descr,
			images FROM '.TBL_AD.
          ' WHERE link_id IN ('.$zap.')'.
          ' ORDER BY link_id DESC';
	  
 
  $res = $db->query($ql);
 
   while($v = mysql_fetch_assoc($res)){
	
	$v['f_title'] = Cut_Text_by_words($v['f_title'], 40);
	$v['f_descr'] = strip_tags($v['f_descr']);
	$v['f_descr'] = Cut_Text_by_words($v['f_descr'], 70);
	
        $tpl->AddCell('b_RandomEntries_Browse', hwSQLRowGet($v));
      }
      
    }

Какой из предложенный вариантов быстрее работает и почему?

Как во второй вариант добавить интервал смены рандомных позиций 10 - 20 мин.?
 

serg30

Новичок
Проверил!

В первом варианте 3,73 секунды скорость загрузки из 800 записей.
Во втором - 3,93 секунды

Но, это грубый имперический подсчет и я не уверен, что он точный!

Сам проверь, никому тут это неинтересно.
Я расчитывал, что здесь опытные люди и взглянув на код, смогут дельный совет дать!
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Люди то тут умные, только за тебя никто код отлаживать не будет. Если тормозит конкретное место и ты бы задал вопрос "как пофиксить", ситуация была бы иная.
 

serg30

Новичок
только за тебя никто код отлаживать не будет
Как правильно вести отладку в данной ситуации?
Если тормозит конкретное место
Пока не тормозит, но хотелось бы остановится на более рациональном и быстром решении.

Например, я знаю, что использовать rnd в запросах нежелательно, т.к. это источник slow queries.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
serg30
Есть разные методы, от замеров времени генерации страницы, до замеров производительности самого sql запроса. Детальнее в гугле. <Профайлинг php скриптов> и т.д.
 

zerkms

TDD infected
Команда форума
Пока не тормозит, но хотелось бы остановится на более рациональном и быстром решении.
Рациональность и скорость решения очень зависит от контекста. То, что быстро и рационально в одном месте может быть медленным и глупым в другом.
 

serg30

Новичок
Касательно второго варианта, есть ли возможность задать интервал между рандомной сменой позиций?

Случайно, не подскажете, как это сделать?
Буду благодарен за наглядный
грубый имперический
пример!
 
Сверху