24

我有一个带有 ajax 搜索字段的 wordpress 网站,它返回一个帖子列表,只有标题、网址、日期和类别。

我想对结果进行分页,以便每次最多显示 10 个结果。

我的疑问是:每次翻页时发出不同的请求还是只发出一个请求来获取所有帖子然后通过javascript管理分页(响应是我的JSON)是好的吗?

发出更频繁的小请求,响应轻的还是大的更好?

我想在网站生命之初,第一个解决方案是最好的解决方案。随着站点的增长,我不确定可扩展性。

你怎么看?

更新:我收到了几个非常好的答案,解决了更多用户界面方面的问题。

Hwr 我希望您更多地关注性能的观点。我的网站在共享服务器上,但我们预计流量会快速增长,因为该网站将获得国际曝光。我担心 wordpress 将无法应对来自 ajax 请求的增加的开销。

所以回到这个问题,对于服务器总负载,许多小请求,只加载请求的结果页面还是一个包含所有结果的大页面,哪个更好?

考虑到不是所有的用户我想都会检查所有的结果页面我想第一个......

4

5 回答 5

21

正确答案是:“视情况而定”。

如果您正在处理已知数量(每页 10 个结果,10 页结果),并且您希望所有这些都尽快提供给用户,那么我建议在 500 毫秒内下载块(10 或 20)计时器或类似的东西。

然后您可以异步填充额外的后页,并相应地更新“总页数”控件。

从那里,您的用户可以立即获得结果,并且能够在 2 秒左右的时间内在所有数据之间来回切换。

如果您有一个网站需要立即访问所有数据,并且需要显示 40 个结果,那么请使用大转储。

如果您有一个无限滚动的网站,那么您会想要获取几个页面长度。对于 Twitter 之类的东西,我可能会预先计算容器的平均高度,而不是屏幕高度。然后我会下载 3 或 4 个屏幕长度的推文。从那里,当用户滚动到他们的第二个或第三个屏幕(或分别为第三个或第四个)时,我会下载下一批。

所以我的事件可能会附加到一个 onscroll 上,它会检查它是否被允许运行(如果它自上次运行以来至少 16 毫秒,——显然,我们仍在滚动),然后它会检查它在哪里,就它与底部的接近程度而言,考虑到屏幕高度,以及最后一批 ( screen_bottom >= latest_batch.height * 0.75) 或类似的总高度。screen_bottom 将与 last_batch 相关,因为如果用户向上滚动,高于前一个批次,screen_bottom 将完全是一个负数。

...或将它们标准化,以便您只处理百分比。

这足以让您感觉数据始终在您身边。您不想在开始时等待一个巨大的块加载,但您也不想在尝试移动时等待加载小块。

因此,根据您正在做的事情以及您希望用户如何使用您的数据,找出快乐的媒介是什么。

于 2012-08-30T16:52:38.170 回答
4

有两个因素在此决定中起作用:用户如何与您的网站互动(例如,他们查看了多少结果以及他们如何查询)以及“平均搜索结果”有多大。如果您有数千个帖子和通用搜索词,那么如果您走“大一”之路,您可能会获得非常大的结果集。如果您的用户倾向于在此进行大量浏览,那么如果您在每个页面加载时都发出请求,这将导致大量请求。

没有通用答案,这在很大程度上取决于您的应用程序和用户的搜索模式。一般来说,我会做最简单的事情来完成这项工作,但还要监控用户交互(例如查询和结果大小的记录)、站点性能(例如通过 Google Analytics 加载时间)和服务器负载(例如通过 munin ) 在您的页面上。如果您遇到问题,您仍然可以从此时开始优化您的应用程序 - 到那时您将对您的用户和您的应用程序有更好的了解。

于 2012-08-30T16:33:50.237 回答
3

嗯,首先。如果您的 AJAX 正在创建与普通页面加载相同的帖子查询,则可以模拟页面加载。即,查询一堆帖子(比如一个有很多帖子的页面),将它们的所有数据发送到您的 JS,并让它处理分页。

当然,您不能一次发送所有帖子,因此您必须处理有多少页面可用。因此,我认为最好一次只查询一页的帖子。请记住,正常的 WP 行为是进行一个返回帖子 ID 的查询,然后为页面中的每个帖子查询整个帖子。

如果您想优化您的网站,请安装缓存插件。它将在 HD 中缓存所有数据库查询,然后使用这些文件而不是再次进行相同的查询。

于 2013-01-08T13:10:24.850 回答
1

我是asjst的创建者,发现下载速度要快得多,但由于设备的上传速度,资源的请求速度很慢。

大上传不好

红色是上传蓝色是下载

正如您在上面的屏幕截图中看到的那样,您上传了很多字节,下载了几个字节。

通常下载比上传快。

于 2018-05-21T17:52:50.957 回答
0

我遇到了类似的情况。我无权访问服务器,必须从 Excel 以 .xlsb 格式保存 Sharepoint 上的文件(我能获得的最小文件大小)。我使用自定义二进制 ajaxTransport 将它们作为 arrayBuffers 带回,然后使用 threadsJS 处理各个线程上的缓冲区以通过 SheetsJS 获取可用的 JSON 数据,然后将它们合并到单个 JSON 数据数组中。

根据我的测试,一个大文件需要 41 秒才能完成处理,4 个小文件需要 28 秒,8 个更小的文件需要大约 20 秒,然后 16 个更小的文件仍然需要大约 20 秒......

因此,随着文件变小,回报会逐渐减少,因为 AJAX 请求数量的增加抵消了更快的文件处理时间。老实说,我没有看到使用线程或不使用线程之间的实际速度增加,可能是因为 AJAX 调用的异步性质允许在调用开始和结束之间进行处理,或者可能是因为我没有做的足够多,可以看到很大的不同,但是线程版本允许我的页面加载器在数据加载时不会冻结,所以我想这是一个加号。

于 2018-06-20T20:36:19.650 回答