Страницы

Поиск по вопросам

вторник, 17 марта 2020 г.

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

#mysqli #while #php #foreach


Функции выборки товаров из базы:
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();



html код



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


Ответы

Ответ 1



А много ли товаров? И можно оптимизировать конструкцию, убрав $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(); html код: По результатам сможете увидеть, какой кусок у Вас долго выполняется.

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

Комментариев нет:

Отправить комментарий