#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).
Комментариев нет:
Отправить комментарий