Почему этот цикл for работает очень медленно?

Почему этот цикл for работает очень медленно?

Я пытался максимально сократить этот цикл 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 .= ',';
    }

  }

Пример текста.

Вероятно, потому что ваш запрос кэшируется в базе данных, тогда на 2-м, 3-м прогоне кажется быстрее

Felippe Duarte 31.08.2018 22:59

@FelippeDuarte У меня один и тот же запрос в разных циклах for и работает быстро, но с этим у меня проблема.

user10128553 31.08.2018 23:01

Вы можете использовать SELECT COUNT(col_name), а не SELECT *, поскольку это ненужный поиск данных, если все, что вам нужно, - это количество возвращаемых строк.

RiggsFolly 31.08.2018 23:02

Вы можете подготовить запрос ОДИН РАЗ и использовать параметры и привязать переменные при каждом выполнении. Это заставит запрос компилировать и оптимизировать шаги один раз за скрипт, а не один раз за итерацию.

RiggsFolly 31.08.2018 23:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
4
54
1

Ответы 1

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

Другие вопросы по теме