[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Увеличить скорость исполнения функции
antonbergov
Функция выводит карту изображение, изображение состоит из 1053 блоков, 32 на 32,
39 x 27 = 1053 (39 блоков по горизонтали, 27 по вертикали), Например: если в таблице t_grid найден блок, тогда выводиться ссылка и title баннера, если его нет в базе тогда ввыодится просто ссылка.

На данный момент функция выполняется за 5 секунд, я думаю она может выполняться в 100 раз быстрее. Проблема в том что получается 1053 запроса к базе данных.

function show_map()
{
echo "<img src='img/mapbg.png' usemap='#AdMap'>";
echo "<map name='AdMap'>";
$start=microtime(true);
$x1=0;
$y1=0;
$x2=0;
$y2=0;

for ($j = 1; $j <= 27; $j++) {
$y2=$y2+32;
$x1=0;$x2=0;
for ($i = 1; $i <= 39; $i++) {
$z++;
$x2=$x2+32;

$query = sprintf("SELECT * FROM t_grid WHERE i_position='%s' LIMIT 1",mysql_real_escape_string($z));
$result=mysql_query($query );
if (!$result) { echo("</br></br>Invalid query=".$query." - ".mysql_error()."<br>");exit;}
else if (mysql_num_rows($result)>0)
{
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
echo "<area shape='rect' coords='$x1,$y1,$x2,$y2' target='_blank' href='".SITE_URL."/go_url.php?block_url=".$row['id']."' title='".$row['s_title']."'>";

}
else echo "<area shape='rect' coords='$x1,$y1,$x2,$y2' target='_blank' href='".SITE_URL."/buy.php?block=$z' title='Купить баннер №$z'>";

$x1=$x1+32;
}
$y1=$y1+32;
}
$elapsed=microtime(true)-$start;
Echo "Время выполнения скрипта: $elapsed";

echo "</map>";
}



 ! 

М
код оформил
kirik




Спустя 6 минут, 2 секунды (9.12.2010 - 21:15) alex12060 написал(а):
Мне кажется, что эти блоки лучше хранить в файле, и как раз, откроешь файл 1 раз, считаешь данные, расфасуешь и все. 1053 запроса. Ужас то какой)
А если 100 человек разом посмотрят, так и упасть не долго х)

Спустя 2 минуты, 6 секунд (9.12.2010 - 21:17) kirik написал(а):
Вынесите запрос за циклы, и переделайте его в:
SELECT `id`, `s_title` FROM `t_grid` WHERE `i_position` > 0 AND `i_position` < 1054

Тоесть сначала вытаскиваем все значения, а потом рисуем карту исходя из них.

УПД
колонка i_position полюбому должна быть индексная (если не уникальная).

Спустя 35 секунд (9.12.2010 - 21:18) antonbergov написал(а):
Если 100 откроет будет жесть, хостер повесится smile.gif
Наверное надо в массив считывать, по другому ни как?

Как лучше сделать?

Спустя 1 минута, 15 секунд (9.12.2010 - 21:19) antonbergov написал(а):
SELECT `id`, `s_title` FROM `t_grid` WHERE `i_position` > 0 AND `i_position` < 1054

И как это обработать?

Спустя 3 минуты, 23 секунды (9.12.2010 - 21:22) kirik написал(а):
Цитата (antonbergov @ 9.12.2010 - 13:19)
И как это обработать?

Всмысле? Берется while, проходимся по результатам запроса, собираем массив, где индексом будет i_position, и потом из этого массива вытаскиваем нужные значения.
Да, запрос чутка поправить нужно. Еще вытаскиваем столбец i_position естественно.
SELECT `id`, `s_title`, `i_position` FROM `t_grid` WHERE `i_position` > 0 AND `i_position` < 1054

Спустя 7 минут, 40 секунд (9.12.2010 - 21:30) antonbergov написал(а):
Цитата (kirik @ 9.12.2010 - 18:22)
Цитата (antonbergov @ 9.12.2010 - 13:19)
И как это обработать?

Всмысле? Берется while, проходимся по результатам запроса, собираем массив, где индексом будет i_position, и потом из этого массива вытаскиваем нужные значения.
Да, запрос чутка поправить нужно. Еще вытаскиваем столбец i_position естественно.
SELECT `id`, `s_title`, `i_position` FROM `t_grid` WHERE `i_position` > 0 AND `i_position` < 1054

Идею понял сегодня попробую отпишу!

Вопрос 2: Если я еще буду выводить на карту изображения на каждый блок с помощью GD,
1000 штук наверное времени будет немеренно или можно попробовать?

Спустя 17 минут, 15 секунд (9.12.2010 - 21:47) kirik написал(а):
Цитата (antonbergov @ 9.12.2010 - 13:30)
Если я еще буду выводить на карту изображения на каждый блок с помощью GD,
1000 штук наверное времени будет немеренно или можно попробовать?

Всмысле будете рисовать одну большую картинку из кучи маленьких?
Думаю что тут лучше кэшировать большую картинку, и потом просто отдавать ее. Смысла в постоянных перерисовках тут нет. А при добавлении в БД новой записи - просто перерисовывать картинку.
Так же стоит поступить и с выводом самой карты - полностью кэшировать уже готовый html в файл, и при последующих запросах отдавать этот файл. При изменении "перерисовывать" его тоже.

Спустя 2 часа, 4 минуты, 46 секунд (9.12.2010 - 23:52) antonbergov написал(а):
Спасиба за ответ, запаролся на таком коде:

Как Вы написали получил массив:
SELECT `id`, `s_title`, `i_position` FROM `t_grid` WHERE `i_position` > 0 AND `i_position` < 1054

Вопрос в том что, раньше SELECT * FROM t_grid WHERE i_position='%s' я рисовал так, если есть запись с данным i_position, то выводил одну, строку если нет то другую.

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

for ($j = 1; $j <= 27; $j++) {		
$y2=$y2+32;
$x1=0;$x2=0;
for ($i = 1; $i <= 39; $i++) {
$z++;
$x2=$x2+32;

while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
}


Тоесть я незнаю как проверить если запись в этом массиве?


 ! 

М
Оформляйте код!
kirik

Спустя 6 часов, 25 минут, 15 секунд (10.12.2010 - 06:17) kirik написал(а):
Цитата (antonbergov @ 9.12.2010 - 15:52)
Тоесть я незнаю как проверить если запись в этом массиве?

// самое начало скрипта
$query = mysql_query('.. тут запрос ..');
$arr = array();
while($row = mysql_fetch_assoc($query)) {
$arr[$row['i_position']] = $row;
}
// потом идут ваши циклы, в которых:
for ($j = 1; $j <= 27; $j++) {
$y2=$y2+32;
$x1=0;$x2=0;
for ($i = 1; $i <= 39; $i++) {
$z++;
$x2=$x2+32;
//...тыц тыц а потом:
if(isset($arr[$z])) {
echo 'такой элемент есть';
} else {
//.... бла бла бла

Спустя 2 дня, 17 часов, 3 секунды (12.12.2010 - 23:17) antonbergov написал(а):
Супер, скорость 0.160990953445. Благодарен.

Еще вопрос по кэшированию не могли бы рассказать как это сделать?

Спустя 50 минут, 12 секунд (13.12.2010 - 00:07) vital написал(а):
Цитата
Проблема в том что получается 1053 запроса к базе данных.

Жесть.. мне тут недавно нагоняй дали за запросов 5 в цикле,а это... ваще жесть.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.