我是一个新手,正在使用 RoR.i 计划使用来自 scriptalicious 库的效果以及用于照片显示和过渡效果的 jquery 创建一个用 cake php 框架编写的轻量级照片展示网站。
由于该网站的照片非常丰富,我可以采取哪些编程步骤来确保所有照片和其他页面都能快速加载?
我是一个新手,正在使用 RoR.i 计划使用来自 scriptalicious 库的效果以及用于照片显示和过渡效果的 jquery 创建一个用 cake php 框架编写的轻量级照片展示网站。
由于该网站的照片非常丰富,我可以采取哪些编程步骤来确保所有照片和其他页面都能快速加载?
我认为你把事情搞混了一点。ror 与 php/cake 混合?
所以,关于性能。这主要取决于您认为您将拥有多少用户,这些用户是谁以及他们做什么。每小时 10 次还是每秒 100 次?他们是长时间看图像还是快速地从一页跳到另一页?
这里有一些技术性不太强的技巧。没有服务器配置优化,没有 memcached 等等。开始用常识思考性能——这不是圣杯!
您的网站/应用程序是否太慢?大多数情况下,情况并非如此。加速它从来没有什么坏处,但人们通常过于关心性能。永远记住:这不是关于快,而是关于足够快。没有人注意到一些额外的毫秒。如果您的页面需要一秒钟来加载,50% 的加速是显而易见的,但如果它只需要 100 毫秒,则几乎无关紧要。
要确定您的网站是否运行缓慢,请对其进行基准测试。有很多方法可以做到这一点,一种是自动化的,比如ab
(apache benchmark)。它模拟了许多用户连接到您的网站,并为您提供了一个很好的总结,它需要多长时间才能响应。另一个是:使用它。而不是在本地网络中!如果你觉得它很慢,那就做点什么。
照片展示在很大程度上取决于图像。图片很大。因此,请确保您的服务器有足够的带宽来快速交付它们。
如果您缩放图像(这很可能),请不要在每个页面请求上调整图像大小,缓存缩放图像!也缓存缩略图。缓存一切。处理和交付静态文件比不断地进行所有处理要便宜得多。
考虑图像的质量。快速交付比高图像质量更重要吗?调整图像大小——更好的压缩意味着更小的文件大小、更低的质量和更快的交付。
想想可用性。如果没有缩略图页面,人们必须按顺序浏览您的图库,查看很多他们不想看到的照片。如果他们已经看到图像,他们可以直接跳转到那些重要的(降低带宽使用和每秒请求)。想想flickr:显示的图像的大小......它们就像邮票 - 500 像素宽,人们仍然很开心。如果他们需要更大的版本,他们无论如何都会点击“所有尺寸”链接。
技巧,技巧,技巧:早些时候,当用户使用模式冲浪时,有时会传输低分辨率/高压缩图像,因此用户在短时间内就有了一些东西。只有在加载第一张图像后,更大的版本开始。这已经不常见了,因为今天大多数用户都有宽带,所以发送额外的图像只是额外的工作量。
想想观众。他们会用 14.4k 调制解调器或宽带访问您的网站吗?他们是否习惯于缓慢加载网站(可能是摄影师)?检查您的统计数据以了解它们。
您的后端脚本语言很可能不是您的问题。php 不是很快,ruby 也不是很快 - 与 c 或 java 或 ocaml 相比。框架比手工优化的代码慢。调试您的代码以查看慢速部分在哪里。我猜?图像大小调整和数据库访问。切换到另一种语言或优化代码时,这不会改变。
涉及的因素很多。他们之中有一些是:
服务器端处理:您的应用程序快吗,您的硬件快吗?
交付:请求和文件从客户端传输到服务器的速度有多快,反之亦然?(取决于带宽)
客户端渲染:他们的浏览器有多快,需要完成多少工作?
用户习惯:客户端还需要速度吗?有时,慢速页面是没有问题的,例如,如果他们在那里呆了很长时间而没有点击。想想 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.
这个问题很模糊。获取页面所花费的大部分时间通常是获取静态内容。以下是一些独立于语言或框架加快加载时间的经验法则:
当然,这只是冰山一角。这些是很好的第一步。
减少库的数量,你确定要使用 jquery + scriptalicious。坚持简单的事情,不要寻找复杂的动画。
快速加载 => 缓存,带有照片的页面非常适合缓存。
如果您担心的是用户速度感觉,您可能希望在后台预加载图像以预期用户操作,但认为这可能会增加您的服务器负载。仅当您拥有良好的带宽合同时才执行此操作。
如果您能够制作一个非常静态的拇指首页,比如每天更改两次,您可以使用精灵技术来减少加载许多拇指的延迟,请参阅: