Я пытался максимально сократить этот цикл for, но отладчик ошибок не может найти здесь проблемы? Используя приведенный ниже код на веб-сайте, ответ страницы составляет 30 секунд при первой загрузке и 8 секунд при 2-й, 3-й загрузке.
$modules_concat = "(CONCAT(',', `site_id`, ',') REGEXP ',(1|2),' AND m_type='my_table_name)";
$b2_s_v_a = '';
for ($i = 1, $j = 168; $i <= 168, $j >= 0; $i++, $j--) {
if ($i < 25) {
$time_lang_for_start = $i+662;
$time_lang_for_day = $lang['user_login_2'];
$b2_time_hour = ($j-144)." HOUR AND HOUR(date_added) = ".($i-1);
$b2_time_day = 'monday';
} elseif ($i < 49) {
$time_lang_for_start = $i+638;
$time_lang_for_day = $lang['user_login_3'];
$b2_time_hour = ($j-120)." HOUR AND HOUR(date_added) = ".($i-25);
$b2_time_day = 'tuesday';
} elseif ($i < 73) {
$time_lang_for_start = $i+614;
$time_lang_for_day = $lang['user_login_4'];
$b2_time_hour = ($j-96)." HOUR AND HOUR(date_added) = ".($i-49);
$b2_time_day = 'wednesday';
} elseif ($i < 97) {
$time_lang_for_start = $i+590;
$time_lang_for_day = $lang['user_login_5'];
$b2_time_hour = ($j-72)." HOUR AND HOUR(date_added) = ".($i-73);
$b2_time_day = 'thursday';
} elseif ($i < 121) {
$time_lang_for_start = $i+566;
$time_lang_for_day = $lang['user_login_6'];
$b2_time_hour = ($j-48)." HOUR AND HOUR(date_added) = ".($i-97);
$b2_time_day = 'friday';
} elseif ($i < 145) {
$time_lang_for_start = $i+542;
$time_lang_for_day = $lang['user_login_7'];
$b2_time_hour = ($j-24)." HOUR AND HOUR(date_added) = ".($i-121);
$b2_time_day = 'saturday';
} elseif ($i < 169) {
$time_lang_for_start = $i+518;
$time_lang_for_day = $lang['user_login_8'];
$b2_time_hour = $j." HOUR AND HOUR(date_added) = ".($i-145);
$b2_time_day = 'sunday';
}
$b2_n_o = 'test';
$time_lang_for_get = $lang["user_login_$time_lang_for_start"];
$time_ready_ch = 'time_ready_for_'.$i;
$$time_ready_ch = $time_lang_for_day.', '.$time_lang_for_get;
$b2_ch_v = 'b2_g_v_'.$i;
$$b2_ch_v = $db->QueryGetNumRows("SELECT * FROM m_z_analytics WHERE $modules_concat AND date_added BETWEEN NOW() - INTERVAL 1 WEEK AND NOW() - INTERVAL $b2_time_hour AND DAYNAME(date_added) = '$b2_time_day'");
$b2_s_v_a .= ${"b2_g_v_$i"};
if ($i) {
$b2_s_v_a .= ',';
}
}
Пример текста.
@FelippeDuarte У меня один и тот же запрос в разных циклах for и работает быстро, но с этим у меня проблема.
Вы можете использовать SELECT COUNT(col_name), а не SELECT *, поскольку это ненужный поиск данных, если все, что вам нужно, - это количество возвращаемых строк.
Вы можете подготовить запрос ОДИН РАЗ и использовать параметры и привязать переменные при каждом выполнении. Это заставит запрос компилировать и оптимизировать шаги один раз за скрипт, а не один раз за итерацию.






Наиболее вероятной причиной является ваш запрос к базе данных, поскольку вы вызываете его 168 раз. Вам нужно получить все столбцы (SELECT *) в каждом? Если нет, укажите те, которые вам нужны. Вы также можете попытаться получить все данные за меньшее количество вызовов и впоследствии проанализировать, насколько это необходимо.
Вероятно, потому что ваш запрос кэшируется в базе данных, тогда на 2-м, 3-м прогоне кажется быстрее