Скрипт вывода товаров, очень долго грузится

Рейтинг: 3Ответов: 2Опубликовано: 18.11.2014

Функции выборки товаров из базы:

function result_to_array($result) {
    $res_array = array();
    $count = 0;
    while( $row = $result->fetch_assoc() ) {
        $res_array[$count] = $row;
        $count++;
    }
    return $res_array;
}

function get_product() {
    connect_db();
    global $mysqli;
    $result = $mysqli->query("SELECT *FROM `product` ORDER by `id` DESC");
    $result = result_to_array($result);
    return $result;
}

На самой странице все товары выводятся циклом foreach:

$products = get_product();

<? foreach ($products as $product): ?>

html код

<? endforeach; ?>

Проблема в том, что страница с товарами открывается ну очень долго, раньше просто на этой же самой странице делал запрос и выводил все через while, по скорости было ощутимо быстрее.

Подскажите, что я делаю не так и почему так медленно работает скрипт?

Ответы

▲ 2Принят

А много ли товаров?

И можно оптимизировать конструкцию, убрав $count:

while( $row = $result->fetch_assoc() ) {
        $res_array[] = $row;
    }

Перед выполнением кода и после выполнения добавьте microtime():

function result_to_array($result) {
    $ra_start = microtime();

    $res_array = array();
    $count = 0;
    while( $row = $result->fetch_assoc() ) {
        $res_array[$count] = $row;
        $count++;
    }

    $ra_end = microtime();
    echo $ra_end - $ra_start;
    return $res_array;
}

function get_product() {
    $gp_start = microtime();

    connect_db();
    global $mysqli;
    $result = $mysqli->query("SELECT *FROM `product` ORDER by `id` DESC");
    $result = result_to_array($result);

    $gp_end = microtime();
    echo $gp_end - $gp_start;
    return $result;
}

На самой странице все товары выводятся циклом foreach:

$products = get_product();

<?
$for_start = microtime();
foreach ($products as $product): ?>

html код:

<? endforeach;
 $for_end = microtime();
    echo $for_end - $for_start;
?>

По результатам сможете увидеть, какой кусок у Вас долго выполняется.

▲ 2

Идите поэтапно:

1) Смотрим, а не тупит ли mysql:

$result = $mysqli->query("SELECT *FROM `product` ORDER by `id` DESC");
exit();
$result = result_to_array($result);

2) Как быстр while:

 while( $row = $result->fetch_assoc() ) {
    $res_array[$count] = $row;
    $count++;
}
exit();
return $res_array;

3) Как быстр вызов $products = get_product();

$products = get_product();
exit();

4) Убираем <? foreach ($products as $product): ?> и смотрим, как работает без него.

Если долго выполняеться этап 1, оптимизируем mysql запрос (табличка возможно очень большая).
Если долго выполняеться этап 2, используем ответ выше.
Если долго выполняеться этап 3 (без двух предыдущих ) - что-то очень странное.
Если долго выполняеться этап 4, то используем for вместо foreach (https://stackoverflow.com/questions/3430194/performance-of-for-vs-foreach-in-php).
Если ничего не помогает и вызовы повторяються, то пихаем все в мемкэш (вплоть до html).