好的,所以我正在构建一个网站,人们可以在其中发布新闻、评论、问题等。人们还可以对所有这些对象进行评分,最喜欢其中的大部分,分享它们等。该网站是 PHP+MySQL。我用 PHP 编写了一个脚本,它执行以下操作:
- 获取过去 5 分钟内添加的所有评论和分数。将每个评论对象的流行度变化添加到“流行度”表中。
- 获取添加到其中的所有新闻和分数/观点/收藏夹/分享。计算每个新闻故事的流行度(考虑到从第 1 步开始附加到它们的评论的流行度变化),并在流行度表中插入一条记录,其中包含每个新闻对象的流行度变化。
- 对问题和其他对象类型重复第 2 步
我尝试使用 cron 作业每 5 分钟运行一次此脚本(这实际上是一个 symfony 任务),PHP 开始阻塞并吃掉我所有的服务器资源。
运行根据 MySQL 数据库中的数据计算新数据然后将计算的数据插入数据库的后台分析脚本的首选方法是什么?我确定我在这里遗漏了一些基本程序。我应该注意到数据库在不同的服务器上并且该服务器没有资源问题。问题似乎仅限于 PHP 在循环遍历对象、计算流行度(简单计算)和插入数据库时阻塞应用程序服务器。
谢谢
-- 编辑
如何将数据库复制到仅用于计算的服务器。我可以使用复制的数据库在计算服务器上运行流行度脚本,并将计算出的流行度记录插入到实时数据库中。它当然会稍微延迟,但这不是什么大问题。不过,我不确定这是否会解决 PHP 资源消耗问题。
最佳答案
首先要做的是尝试减少执行的查询数量。如果您的 sql 和 web 服务器位于不同的机器上,这一点尤其重要。尝试使用 JOIN 来计算新闻项的受欢迎程度,而无需逐个查看所有评论。
您可以在同一个查询中计算评论的流行度和新项目的流行度。 (例如 select sum(rating) FROM news, comments, rating WHERE comments.news_id = news.id AND rating.comment_id = comments.id (这个查询过于简单但仍然......))因为你的主要问题是查询量你必须执行,当然你的 mysql 服务器上会有足够的资源。因为大多数时候 sql server 只会等待下一个查询的到来。跨网络的通信比 cpu 和 ram 之间的通信慢 gazillion 倍。基本上发生的事情是:php 向 mysql 服务器发送查询并等待响应。 Mysql 获取一个查询进程,发送响应并等待下一个查询。这种等待需要时间...所以要么减少查询量,要么使用 mysqli 同时发送所有查询 http://php.net/manual/en/mysqli.multi-query.php
关于php - 计算网站上对象 'popularity' 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5092414/