我有一个人们发布图片的网站,人们可以喜欢这样的帖子,就像桌子上有一排,如果有人删除了一个帖子,我想删除该特定帖子的每一行。这个数字可能非常大,如15,000或更多,删除帖子的用户等待的时间可能很长。
要删除帖子,我希望在后台删除另一个脚本中的15,000行。我怎样才能做到这一点?
答案 0 :(得分:9)
很多选择。这是一个建筑/工程决策而不是其他任何事情。我会抛出一个想法。
从软删除开始。而不是实际删除帖子(及其关系),将状态设置为已删除。在关闭时间内设置CRON作业以运行查询以获取状态为已删除的帖子并在当时删除所有内容。
注意到@Berril在他的评论中提出了同样的建议。
另一方面,删除15,000行真的需要很长时间吗?
DELETE FROM `table` WHERE post_id = x
似乎会快速执行,但没有看到数据结构,很难说肯定。
答案 1 :(得分:4)
软删除+ cronjob推荐:
我不建议完全删除记录,除非您必须保护数据隐私,例如
但是,如前所述,已经在每个表中添加了deleted
这样的列,并且当必须删除记录时,您将此列中的值设置为true。
在此之后你可以开发一个将被触发的cronjob。例如。在午夜的每日基地。
cronjob通常会在shell上执行,而且浏览器的时间不会很短。
在您的情况下:删除图片后不要删除所有数据:
当您处理几条记录时,当用户想要删除所有记录时,完全删除所有记录是合法的。
但是,在您的情况下,可能有数千条记录必须删除。因此,当您尝试在用户删除某个图像时删除所有这些内容时,肯定需要时间并可能以超时结束。通过ajax做这件事并不好,因为用户不想等到所有ajax请求都完成。
答案 2 :(得分:3)
使用Ajax。尝试按照脚本请求另一个页面删除后台行。
<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!";
答案 3 :(得分:2)
如果您在fastcgi模式下运行PHP(通常是nginx),您可以使用fastcgi_finish_request()
来完成用户的请求,同时仍然在后台执行操作,例如慢慢删除许多不需要用户确认的记录。