У меня есть приложение для планирования, которое позволяет пользователям создавать массовые события с использованием еженедельного шаблона. Это работает, публикуя уроки шаблона через AJAX
к PHP file
который берет шаблон и копирует его желаемое количество раз. Количество событий, которые он должен создать за один раз, может быть от 200 до 800 в зависимости.
Проблема, с которой я сталкиваюсь, заключается в том, что выполнение этих запросов занимает много времени, что приводит к зависанию веб-сайта и иногда к истечению времени ожидания в ожидании всех записей.
Упрощенный пример:
$events = array('valid array of all events and their details');
foreach($events as $event) {
$query = 'Valid SQL with individual event detaisl';
mysqli_query($connection, $query);
}
На самом деле больше будет происходить, например, вычисление времени начала и окончания, связывание пользователей из junction tables
и т. д. Это должно было бы выполняться 200-800 раз, чтобы создать запись для каждого отдельного события, сделанного шаблоном.
Как бы я ускорить это?
Любое понимание очень ценится!
ОБНОВЛЕНИЕ: я уже пытался увеличить уровень экземпляра SQL. Это не влияет на количество времени, которое требуется.
Некоторые предложения для рассмотрения:
Создание 200-800 новых записей в базе данных за один запрос звучит немного чрезмерно. Логика вашего приложения и модели / структура данных, которые вы используете, вероятно, могут быть значительно улучшены и оптимизированы, если не создавать все события одновременно, а только сохранять настройки, которые позволят вам сгенерировать 800 записей с некоторым кодом, который будет возвращать отдельное событие при необходимости и сохраните его отдельно, если какая-либо пользовательская (не из шаблона) информация была добавлена или изменена в будущем. Это, вероятно, потребует большого количества изменений в вашем коде и может или не может стоить этого (по времени, а не по скорости, что определенно улучшится).
Как уже упоминалось в комментариях, это может быть принято в отдельную задачу с некоторой обратной связью пользовательского интерфейса, сообщающей пользователю о том, что события создаются, а затем другим уведомлением о том, что это уже сделано.
Глядя на ваш код, я вижу (я не очень знаком с PHP / mysql), когда вы создаете 800 событий, вы также обращаетесь к базе данных 800 раз (каждый раз, ожидая ответа о завершении). Предполагая, что узкое место было в этих множественных соединениях, затем путем объединения ваших сгенерированных запросов и одновременной подачи их в базу данных, вы потенциально могли бы достичь некоторого улучшения производительности. См. Пример ниже (запишите необходимую точку с запятой в конце каждого сгенерированного запроса и mysqli_multi_query
функция, позволяющая отправлять несколько запросов одновременно):
$events = array('valid array of all events and their details');
$query = "";
foreach($events as $event) {
$query .= 'Valid SQL with individual event detaisl;\n';
}
mysqli_multi_query($connection, $query);
Других решений пока нет …