【问题标题】:What is the right way to call dynamic content (currently using ajax) inside a cached page?在缓存页面中调用动态内容(当前使用 ajax)的正确方法是什么?
【发布时间】:2017-01-05 16:21:11
【问题描述】:

我们有一个新闻网站,我们在其中缓存了完整的文章页面。

该页面上有 4 个区域需要继续保持动态:

  1. 查看计数器:当页面加载时,我们为该文章的 view_counts 添加 +1。
  2. 标题:在网站的标题中,我们检查 session->id 是否存在,如果存在,我们会显示欢迎 [名称]、我的个人资料/注销,如果不存在,我们会显示注册/登录。
  3. 评论:我们展示了为那篇文章制作的 cmets。
  4. 跟踪用户行为:我们跟踪用户在网站上的每一个操作

现在我们能想到的唯一方法是通过 AJAX 调用:

$('#usercheck').load(<?php echo "'" . base_url() . "ajax/check_header'"; ?>);

等等。

这会在 CPU 上造成巨大的负载,但解决此问题的正确/替代方法是什么?

请看附件:

【问题讨论】:

  • 您可以在开始时为自己构建一个组合的 AJAX 请求。因此,您可以执行一个请求并将所有内容手动放置到正确的元素中,而不是执行四个请求。
  • 谢谢,这听起来是解决许多问题的好方法。但是这样就够了吗?
  • 什么意思?它将请求减少四倍并且速度更快。但它不会完全降低你的 CPU 负载。负载将来自从其他事物加载数据,例如从数据库加载数据。如果您的负载很高,那么您需要对其进行优化或考虑使用更快的服务器。 ;) 但是您必须以任何方式加载数据,如果您的页面被缓存,ajax 似乎是最好的解决方案......其他解决方案将是服务器端的整页缓存系统,它会为您解析您的文档。但这要复杂得多,需要在服务器上安装额外的软件......
  • 正如@eisbehr 已经指出的那样,问题不在于AJAX 请求,而在于服务器脚本。 AJAX 请求只是对服务器的普通页面请求,它甚至比网页请求更轻,因为(大多数情况下)在它之后没有请求任何资源(图像、样式表等)。所以测试和提高服务器脚本的性能。并且仅在需要时执行 AJAX 请求,例如每分钟左右。注意:当 4 个调用不使用相同的数据时,将它们组合起来是微优化。
  • @eisbehr 在这种情况下将 AJAX 请求合并为一个不是解决方案,因为它是 msoft 提到的微优化,因为检查这些请求的频率会有所不同,例如 cmets 和访问需要更多迭代而不是标头并多次执行所有操作会降低服务器性能。我认为在这种情况下,我们应该依赖 node.js 或类似的服务器端脚本来进行此类小更新,而使用 ajax 进行一次更新或者可能是不那么频繁的请求。

标签: javascript php jquery ajax cpu


【解决方案1】:

首先,您不必对所有可能的动态内容都使用 AJAX,尤其是在 cmets 的情况下,您不妨通过iframe 加载它们。 这样,您就不会依赖 Javascript 来发出请求。 它甚至可能适用于柜台。

但是,根据我从您的图表中看到的情况,您的问题不是 Javascript,也不是数据库服务器。在我看来你有一些沉重的 PHP 控制器,也许你正在加载一个沉重的框架只是为了检查 $session-&gt;id

此外,您所说的“我们跟踪每一个操作”是什么意思?你如何追踪他们?你是从每件小事中发送一个 AJAX 请求,还是用 JS 去抖动它们,并且每 30 秒左右只发送一个?

我的建议是,您应考虑所调用的 PHP 代码的大小,并尽可能将其缩小,如果可行,甚至可以减至零(通过利用 localStorage 来跟踪您之后的用户会话第一次登录),并可能以其他方式加载计数器和 cmets。

例如,我推断您在每次页面加载时仅检查一次计数器,而在当前用户阅读文章时忽略其他用户的后续加载,因此您的计数器可能恰好过时一次,而,取决于您的流量。

我会更好地解释一下:你的页面有 n 个视图,所以当我加载它时,你请求 n 然后显示 n+1 对我来说。在我阅读时,同一页面被其他用户请求并查看了 x 次。您在服务器上的计数器肯定已更新为 n+x,但我页面上的计数器仍然显示 “n 次浏览”。 那么,挑剔并向我展示 n+1 并且不更新它,从而被 x 关闭有什么意义呢?

所以,首先计数器控制器应该尽可能的纤细,如果你将它加载到 iframe 中,在没有 AJAX 的情况下自动更新呢?

How to refresh an iframe not using javascript?

这将使计数器保持最新,您可以在每次页面查看时只使用 PHP 渲染一次,然后静态地提供生成的 HTML 文件。

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2011-05-22
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多