Web应用程序:在一个页面加载中预处理和发送所有项目,或将项目分成单独的客户端请求?

时间:2012-01-08 20:25:33

标签: php javascript mysql performance optimization

我的任务是监督我们公司古老的(20世纪90年代!)PHP应用程序的重写/现代化。当然,我既兴奋又惶恐地接近这个任务。我花了几周时间研究框架,库,基准测试等。

该系统的主要功能之一是从后端MySQL db加载数据项并将它们呈现给前端用户。显示哪些项目是一个复杂的问题,但它可以是任何组合或项目数量。比方说,就像目录一样。用户可以查看一个项目,浏览项目类别或搜索项目。此外,可见性和其他特定项目级别数据有许多限制和条件。

我的具体问题是:

**有关加载和显示商品数据的专家有哪些想法?在页面加载时间,服务器压力或任何其他因素......我应该 (A):让服务器计算所有输出数据,然后在初始页面请求中将其发送到客户端(浏览器)?

(B):或者,我应该在javascript变量中输出基本页面骨架和ID列表,然后让客户端分别请求每个项目,然后让响应者发回(JSON?)数据和让客户端填充页面?**

我在这里寻求的是一些程序员的智慧,以及最有效的方法。我不希望建议告诉我从PHP切换到另一种语言,或者我需要运行自己的测试。我不是要求任何人为我写任何代码。我只是希望你的智慧/建议以哪种方式更好,为什么,或者因为一种方法与另一种方法相关的因素。

虽然情景(A)对我来说似乎老了,而且灵活性较差。我认为前端用户可能会更快。如果我的服务器是最大优化和缓存的,那么这(仍)是不是最有效的方式?

选项(B)看起来更酷,更“现代”,但这种方法有什么意义吗?除了一些前端JavaScript和动态模板技能外,我还能获得什么?看起来每个页面加载可能需要几十个额外的请求,以及额外的客户端处理,这对我来说是针对大枪的最新页面速度优化建议。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

考虑到你有选择A和B的措辞。明确的选择是A.这就是原因:

  

...以及javascript变量中的ID列表,然后让客户端分别请求每个项目,然后......

这会导致性能非常差,因为现在你正在做很多SELECT * FROM items WHERE id=x,每个都返回1条记录,而不是SELECT * FROM items WHERE something_else,所以没有你的每个MySQL查询的头脑,加上每个HTTP请求,效率低下。

所以,正如你所说的那样,选项A肯定。

但是,让我们回到我认为你正在使用选项B ...

的要点

假设您有一个HTML /网络搜索界面,所有这些都在第一次请求时提供,没有结果。现在我输入搜索参数,然后点击“go”。在后台(js / ajax),我的标准可以发送到服务器并进行处理,然后你发回第一页项目的JSON对象(只有数据,item_name,item_id,item_desc等,没有html,没有样式)然后浏览器使用javascript将其绘制到页面。

为什么这会更好?您现在可以将您的后端/服务器端视为API,接受查询并返回数据,这是非常干净的代码设计。它不需要循环添加HTML,没有图像资产等的东西。这是非常灵活的,因为现在让我们说你得到订单,使这个项目系统可以通过iPhone应用程序访问!问题?实际上,您已经拥有了JSON API,因此您的iPhone应用程序可以以相同的方式访问此API,并在应用程序内适当地显示数据。

回到网络浏览器方面:这也可能会带来更快的用户体验,因为您发回的数据更容易/更快,服务器可以渲染2)数据量较少的数据只是项目数据,而不是HTML格式或周围的页面元素。

我希望这有助于更深入地了解您的决定。祝你好运!