0

我是一个新手,正在使用 RoR.i 计划使用来自 scriptalicious 库的效果以及用于照片显示和过渡效果的 jquery 创建一个用 cake php 框架编写的轻量级照片展示网站。

由于该网站的照片非常丰富,我可以采取哪些编程步骤来确保所有照片和其他页面都能快速加载?

4

3 回答 3

6

我认为你把事情搞混了一点。ror 与 php/cake 混合?

所以,关于性能。这主要取决于您认为您将拥有多少用户,这些用户是谁以及他们做什么。每小时 10 次还是每秒 100 次?他们是长时间看图像还是快速地从一页跳到另一页?

这里有一些技术性不太强的技巧。没有服务器配置优化,没有 memcached 等等。开始用常识思考性能——这不是圣杯!

  • 您的网站/应用程序是否太慢?大多数情况下,情况并非如此。加速它从来没有什么坏处,但人们通常过于关心性能。永远记住:这不是关于快,而是关于足够快。没有人注意到一些额外的毫秒。如果您的页面需要一秒钟来加载,50% 的加速是显而易见的,但如果它只需要 100 毫秒,则几乎无关紧要。

  • 要确定您的网站是否运行缓慢,请对其进行基准测试。有很多方法可以做到这一点,一种是自动化的,比如ab(apache benchmark)。它模拟了许多用户连接到您的网站,并为您提供了一个很好的总结,它需要多长时间才能响应。另一个是:使用它。而不是在本地网络中!如果你觉得它很慢,那就做点什么。

  • 照片展示在很大程度上取决于图像。图片很大。因此,请确保您的服务器有足够的带宽来快速交付它们。

  • 如果您缩放图像(这很可能),请不要在每个页面请求上调整图像大小,缓存缩放图像!也缓存缩略图。缓存一切。处理和交付静态文件比不断地进行所有处理要便宜得多。

  • 考虑图像的质量。快速交付比高图像质量更重要吗?调整图像大小——更好的压缩意味着更小的文件大小、更低的质量和更快的交付。

  • 想想可用性。如果没有缩略图页面,人们必须按顺序浏览您的图库,查看很多他们不想看到的照片。如果他们已经看到图像,他们可以直接跳转到那些重要的(降低带宽使用和每秒请求)。想想flickr:显示的图像的大小......它们就像邮票 - 500 像素宽,人们仍然很开心。如果他们需要更大的版本,他们无论如何都会点击“所有尺寸”链接。

  • 技巧,技巧,技巧:早些时候,当用户使用模式冲浪时,有时会传输低分辨率/高压缩图像,因此用户在短时间内就有了一些东西。只有在加载第一张图像后,更大的版本开始。这已经不常见了,因为今天大多数用户都有宽带,所以发送额外的图像只是额外的工作量。

  • 想想观众。他们会用 14.4k 调制解调器或宽带访问您的网站吗?他们是否习惯于缓慢加载网站(可能是摄影师)?检查您的统计数据以了解它们。

  • 您的后端脚本语言很可能不是您的问题。php 不是很快,ruby 也不是很快 - 与 c 或 java 或 ocaml 相比。框架比手工优化的代码慢。调试您的代码以查看慢速部分在哪里。我猜?图像大小调整和数据库访问。切换到另一种语言或优化代码时,这不会改变。

关于网站的速度

涉及的因素很多。他们之中有一些是:

  1. 服务器端处理:您的应用程序快吗,您的硬件快吗?

  2. 交付:请求和文件从客户端传输到服务器的速度有多快,反之亦然?(取决于带宽)

  3. 客户端渲染:他们的浏览器有多快,需要完成多少工作?

  4. 用户习惯:客户端还需要速度吗?有时,慢速页面是没有问题的,例如,如果他们在那里呆了很长时间而没有点击。想想 Flash 游戏网站:如果您花一个小时玩 Flash 游戏,您可能甚至不会注意到页面是否在 3 或 5 秒内加载。

感知速度 - 所有四种的混合 - 是重要的指标。

如果你已经确认你真的太慢了​​,一定要优化正确的部分。如果服务器足够快,优化服务器端脚本是没有用的,但是页面需要很长时间才能在浏览器上呈现。如果您的带宽被阻塞,则无需优化渲染时间。

关于优化

在构建应用程序时,性能是不可或缺的一部分。如果你真的需要快速的东西,你必须从一开始就计划好速度。如果它不是为速度而设计的,则通常无法进行有效的优化。

对于 Web 应用程序来说并非总是如此,因为它们很容易水平扩展,这意味着:向它扔硬件。
所有事情都需要钱,如果钱对你(或你的老板)很重要,不要忘记它。两周优化应用程序的成本是多少?比如说,优化你(或你的老板)X 欧元(我是欧洲人)的薪水。现在,考虑购买另一台服务器:花费 Y 欧元(包括安装)。如果 Y < X,只需购买服务器就可以了。

随机流行语

最后但并非最不重要的一点是,我会向您抛出一些随机(无序)的流行语,也许有些东西可能会有所帮助。只是谷歌,这应该有帮助......

内容交付网络、(英特尔)SSD、精灵(组合图像以保存请求)、页面压缩(gzip、deflate)、memcached、APC(PHP 字节码缓存)、多个 CSS 和 JS 文件的压缩和合并、有意识地处理 HTTP状态代码(未更改),静态和动态内容分离(不同的服务器和域),通过 AJAX 逐步加载(重要内容优先),...

现在我没有想法了。

编辑/更新

我忘记的事情/技术:

  • 实现一个进度条或类似的东西,让用户至少感觉到正在发生的事情。如果仅使用 javascript,则不能使用进度条,但至少显示某种动画沙漏或时钟。如果你使用flash,你可以显示一个真实的进度条。

  • 您可以通过使用 AJAX 或 flash 来跳过完整的页面重新加载 - 只需加载您需要的数据。您经常会在 Flash 图片库中看到此功能。只需加载图像和描述。

  • 预加载:如果用户长时间查看一个图像,您已经可以开始加载下一个图像,因此如果用户继续,它将被浏览器缓存。

免责声明

我从未实现过性能关键型应用程序(有 2 个例外),所以我上面写的大部分内容都是猜测和其他人的经验。今天,您阅读了有关成功初创公司的故事,以及他们如何应对(从性能方面)从每天 100 名到数十亿用户的情况,以及他们如何一直使用巧妙的技巧来解决所有这些问题。
但这会发生在你身上吗?可能不是。每个人都在谈论它,几乎没有人真正需要它(但我承认,知道它仍然很好)

我的真实世界经验(是的,我喜欢写长答案):

有一次我做了一个网站的一部分,每天有几千个独立访问者,由 cms (typo3) 提供支持并在一个专用的 samp-server 上运行(想想使用过的、十年前的 solaris 服务器,而不是 ghz!)。您可以搜索公寓,表格会告诉您通过重新加载 iframe ON-CLICK可以获得多少结果(例如 20-40 平方米:400 次点击,30-60 平方米:600 次点击) 。它非常非常慢(但用户仍然使用它)。持续 100% 负载。解决这个问题是我的工作。
我做了什么?首先,找出它为什么这么慢。我的第一个猜测是正确的,点击请求也是使用了typo3(当然,没有缓存)。通过用一个直接查询数据库的自定义脚本替换这个单个操作,绕过typo3,问题就解决了。负载几乎为零。花了我大约2个小时。

另一个项目每天有大约 1500 名唯一访问者,显示由 Oracle 数据库提供的数据,其中包含数百万行和需要永远(=几秒钟)运行的复杂连接。我在优化 oracle 方面没有太多经验,但我知道:数据库每周只更新一到两次。我的解决方案:我只是通过将 html 写入文件系统来缓存内容。更新后(在半夜)我清除了缓存并开始重建它。所以,我只需要廉价的文件系统读取,而不是昂贵的查询。问题解决了。

both examples taught me that performance in web developement is not rocket science. most of the time the solution is simple. and: there are other parts that are way more important 99% of the time: developer cost and security.

于 2009-04-30T22:18:11.573 回答
2

这个问题很模糊。获取页面所花费的大部分时间通常是获取静态内容。以下是一些独立于语言或框架加快加载时间的经验法则:

  1. 安装Firefox的YSlow 插件
  2. 使用 CSS 精灵
  3. 有一个用于静态内容、nginxlighttpd的轻量级 http 服务器
  4. 在不同的域或子域上提供静态内容,这允许更多的同时 http 请求
  5. 缩小 javascript 和 css
  6. 尽可能多地缓存页面
  7. 保持较低的 http 请求数
  8. 在图像上运行pngcrush或 jpegtran

当然,这只是冰山一角。这些是很好的第一步。

于 2009-04-30T19:50:08.077 回答
0

减少库的数量,你确定要使用 jquery + scriptalicious。坚持简单的事情,不要寻找复杂的动画。

快速加载 => 缓存,带有照片的页面非常适合缓存。

如果您担心的是用户速度感觉,您可能希望在后台预加载图像以预期用户操作,但认为这可能会增加您的服务器负载。仅当您拥有良好的带宽合同时才执行此操作。

如果您能够制作一个非常静态的拇指首页,比如每天更改两次,您可以使用精灵技术来减少加载许多拇指的延迟,请参阅:

http://websitetips.com/articles/css/sprites/

于 2009-04-30T19:38:28.743 回答