Как удалить тысячи строк с PHP и MySQL в фоновом режиме?

У меня есть веб-сайт, на который люди отправляют изображения, людям может нравиться сообщение для каждого, как есть строка в таблице, если кто-то удаляет сообщение, которое я хотел бы удалить каждую строку для этой конкретной записи. Число может быть очень большим, как 15 000 или более, время ожидания может быть длинным для пользователя, который удалил сообщение.

Чтобы удалить сообщение, есть форма, которую я хотел бы удалить 15 000 строк в другой script в фоновом режиме. Как я могу это достичь?

Ответ 1

Множество опций. Это больше архитектурное/инженерное решение, чем что-либо еще. Я выброшу идею.

Начните с мягких удалений. Вместо фактического удаления сообщения (и его отношений) установите статус для удаления. У вас есть настройка задания CRON во время простоя, чтобы запустить запрос, чтобы получить сообщения со статусом удаления и удалить все навсегда в то время.

Только что заметил @Berril предложил то же самое в своих комментариях.

На стороне примечания, действительно ли понадобилось бы столько времени, чтобы удалить 15 000 строк?

DELETE FROM `table` WHERE post_id = x

Похоже, что это будет выполняться быстро, но не видя структуру данных, трудно сказать наверняка.

Ответ 2

Мягкое удаление + cronjob рекомендуется:

Я не рекомендую полностью удалять записи, кроме случаев, когда вы сохраняете конфиденциальность данных, например.

Однако, как уже упоминалось, добавьте в каждую таблицу столбец типа deleted, и когда запись должна быть удалена, вы установите значение в этом столбце равным true.

После этого вы можете создать cronjob, который будет запущен. Например. на дневной основе в полночь.

Обычно cronjob будет выполняться на оболочке и не имеет короткого таймаута в качестве браузера.

В вашем случае: не удаляйте все данные при удалении изображения:

Когда вы имеете дело с несколькими записями, законно удалять все записи полностью, когда пользователь хочет их удалить.

Однако в вашем случае есть, вероятно, тысячи записей, которые нужно удалить. Поэтому, когда вы пытаетесь удалить все из них, когда пользователь удаляет определенный образ, он, безусловно, требует времени и, вероятно, заканчивается тайм-аутом. Выполнение этого с помощью ajax не очень хорошо, так как пользователи не хотят ждать завершения всех аякс-запросов.

Ответ 3

Используйте Ajax. попробуйте выполнить script, чтобы запросить другую страницу для удаления строк в фоновом режиме.

<script>
        var con=new XMLHttpRequest();
        con.onreadystatechange=function()
        {
            if(con.readyState==4 && con.status==200)
                div.innerHTML+=con.responseText+"</br>";
        }
        con.open("POST","db.php",true);
        con.send();
</script>

и напишите следующий код в db.php. Я предположил, что db.php находится в том же каталоге, где ваш текущий html файл:

$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}


$run = mysqli_query($conn,"[Your Query here]");
print "Your Post Deleted Successfully!";

Ответ 4

Если вы запускаете PHP в режиме fastcgi (обычно nginx), вы можете использовать fastcgi_finish_request(), чтобы завершить запрос пользователя, все еще делая что-то в фоновом режиме, например, медленно удаляя многие записи, которые не требуют подтверждения пользователя.