好的,我正在建立一个人们可以发布新闻,评论,问题等的网站。人们也可以评价所有这些对象,最喜欢的对象,分享它们等等。该网站是PHP + MySQL。我在PHP中编写了一个脚本,它执行以下操作:
我尝试使用cron作业每5分钟运行一次这个脚本(它实际上是一个symfony任务),PHP开始窒息并吃掉我所有的服务器资源。
运行后台分析脚本的首选方法是什么,该脚本根据MySQL数据库中的数据计算新数据,然后将计算出的数据插入到数据库中?我确定我错过了一些基本程序。我应该注意到DB位于不同的服务器上,并且该服务器没有资源问题。这个问题似乎局限于PHP在应用程序服务器上的阻塞,循环遍历对象,计算流行度(简单计算)和插入数据库。
由于
- 编辑
如何将数据库复制到仅用于计算的服务器。我可以使用复制的数据库在计算服务器上运行流行度脚本,并将计算的流行度记录插入到实时数据库中。它当然会稍微延迟,但这不是一个大问题。我不确定这是否会解决PHP资源消耗问题。
答案 0 :(得分:1)
首先要做的是尝试减少执行的查询数量。如果您的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 http://php.net/manual/en/mysqli.multi-query.php同时发送所有quires {/ 3}
答案 1 :(得分:0)
如果DB在不同的服务器上,我宁愿选择编写MySQL程序进行计算,或者至少使用持久连接。无论如何,5分钟通常特别适用于繁忙的服务器。 通常这种任务应该在我看来每天进行一次到几次。
答案 2 :(得分:0)
不是将其作为cron作业运行,而是每次执行可以改变它的操作时,都可以更新流行度。因此,例如,当用户添加评论或评价某个项目时,一旦完成,您就会更新该项目的受欢迎程度。