[英]Most efficient way to calculate 'popularity' of objects on website
好的,我正在建立一个人们可以发布新闻,评论,问题等的网站。人们也可以评价所有这些对象,最喜欢它们,分享它们等等。该网站是PHP + MySQL。 我在PHP中编写了一个脚本,它执行以下操作:
我尝试使用cron作业每5分钟运行一次这个脚本(它实际上是一个symfony任务),PHP开始窒息并吃掉我所有的服务器资源。
运行后台分析脚本的首选方法是根据MySQL数据库中的数据计算新数据,然后将计算出的数据插入到数据库中? 我确定我错过了一些基本程序。 我应该注意到DB位于不同的服务器上,并且该服务器没有资源问题。 这个问题似乎局限于PHP在应用服务器上窒息,循环遍历对象,计算流行度(简单计算)和插入数据库。
谢谢
- 编辑
如何将数据库复制到仅用于计算的服务器。 我可以使用复制的数据库在计算服务器上运行流行度脚本,并将计算的流行度记录插入到实时数据库中。 它当然会稍微延迟,但这不是一个大问题。 我不确定这是否会解决PHP资源消耗问题。
那么首先要做的是尝试减少执行的查询数量。 如果您的sql和Web服务器位于不同的计算机上,这一点尤为重要。 尝试使用JOIN来计算新闻项的受欢迎程度,而无需单独浏览所有注释。
那么你可以在同一个查询中计算评论的受欢迎程度和新项目的受欢迎程度。 (例如选择总和(评级)FROM新闻,评论,评级WHERE comments.news_id = news.id AND rating.comment_id = comments.id(此查询过于简化但仍然......))因为你的主要问题是查询量你必须执行,当然你的mysql服务器上将有足够的资源。 因为大多数时候sql server只会等待下一个查询到达。 跨网络的通信比cpu和ram之间的通信慢了几十倍。 基本上发生的是:php向mysql服务器发送查询并等待响应。 Mysql获取查询进程,发送响应并等待下一个查询。 这种等待需要时间......所以要么减少查询量,要么使用mysqli同时发送所有quires http://php.net/manual/en/mysqli.multi-query.php
如果DB在不同的服务器上,我宁愿选择编写MySQL程序来计算,或者至少使用持久连接。 无论如何,5分钟通常特别适用于繁忙的服务器。 通常这种任务应该在我看来每天进行一次到几次。
而不是将其作为cron作业运行,您可以在每次执行将改变它的操作时更新流行度。 因此,例如,当用户添加评论或评价项目时,一旦完成,您就会更新项目的受欢迎程度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.