PHP网站优化

26

我有一个高流量的网站,需要确保网站速度快,以便迅速向所有人显示我的页面。

我在谷歌上搜索了许多关于速度和优化的文章,以下是我找到的:

  • 缓存页面
  • 将页面保存到磁盘中

在内存中缓存页面:

这非常快,但是如果我需要更改页面的内容,则必须从缓存中将其删除,然后重新将文件保存到磁盘上。

将页面保存到磁盘中:

这很容易维护,但是每次访问页面时都必须读取磁盘上的内容。

我应该选择哪种方法呢?


3
请提供您的网站更多细节信息:操作系统、服务器、内容管理系统等等。 - soju
我使用Apache+PHP+MySQL+CentOS - 没有CMS或框架。 - ana
你使用的是什么类型的托管服务?共享式的还是专用的? - Book Of Zeus
我有一台专用服务器。 - ana
5个回答

41

Jan & idm说得没错,但以下是如何做:

缓存(页面或内容)对于性能至关重要。无论您的内容是静态还是动态,请求数据库或文件系统的最小数量都更好。

如果您需要运行动态内容,可以使用 PHP 加速器:

我建议您使用 Alternative PHP Cache (APC)

以下是一些基准测试:

什么是最好的 PHP 加速器?

PHP 加速器:APC vs Zend vs XCache with Zend Framework

Lighttpd – PHP Acceleration Benchmarks

对于缓存内容甚至页面,您可以使用: MemcachedRedis

Memcached: 是一个免费且开源的高性能分布式内存对象缓存系统,具有通用性,但旨在通过减轻数据库负载来加速动态 Web 应用程序。Memcached 是一个内存中的键值存储器,用于存储从数据库调用、API 调用或页面呈现结果中提取的小块任意数据(字符串、对象)。

Redis: Redis 是一个开源的高级键值存储器。它通常被称为数据结构服务器,因为键可以包含字符串、哈希、列表、集合和排序集。

这两个工具都非常适合缓存内容或变量。

以下是一些基准测试,您可以选择喜欢的那个:

Redis vs Memcached

Redis vs Memcached

Redis VS Memcached (稍微更好的基准测试)

关于Redis,Memcached,速度,基准测试和厕所

你还可以安装VarnishnginxG-Wan

Varnish: Varnish是专为内容丰富的动态网站设计的HTTP加速器。与其他HTTP加速器(如最初作为客户端缓存的Squid或主要是起源服务器的Apache)相比,Varnish从一开始就被设计为HTTP加速器。

nginx: nginx(发音为“engine-x”)是一个轻量级的高性能Web服务器/反向代理和电子邮件(IMAP / POP3)代理,采用类似BSD的许可证。它运行在Unix,Linux,BSD变体,Mac OS X,Solaris和Microsoft Windows上。

g-wan: G-WAN是一种带有ANSI C脚本和键值存储的Web服务器,其表现优于所有其他解决方案。

以下是一些基准测试结果,您可以选择最喜欢的:

提供静态文件:Apache,Nginx,Varnish和G-WAN之间的比较

Web服务器性能基准测试

将Nginx + Varnish与Nginx进行比较

Apache、Varnish、nginx和lighttpd

G-WAN vs Nginx


6
我使用Nginx和Redis,它们非常快速。对这个答案点赞+1。 - Gabriel

4
你有一个很好的想法,与我自己所做的非常接近。如果我有一个完全静态的页面,我会保存一个HTML版本,并将其提供给用户,而不是每次生成内容。这在某些情况下可以节省MySQL查询和多个IO操作。每当我做出一些更改时,我的管理界面只需删除HTML文件并重新创建它即可。
这种方法已经在我的服务器上证明可以快100倍左右。

这是最好的缓存方法之一,只需在更改时重新创建静态HTML页面。 - Frederick Behrends
2
这个过程可以很容易地自动化。 - Igor Parra

3
网站性能的重要问题是“是提供静态页面还是提供动态页面?”。
静态页面
加速静态页面的最佳方法是将它们缓存到您网站之外。如果您有能力,可以从CDN (Akamai、Cotendo、Level3) 服务这些页面。在这种情况下,流量永远不会到达您的网站。有几种控制缓存的方法,从固定持续时间到标准HTTP缓存指令。
即使您不能从CDN中提供HTML,但是将图像、JavaScript和其他静态资源存储在CDN上可以加快网站的速度——您可以使用亚马逊等云服务来实现。
如果您无法为HTML使用CDN,则可以使用自己的缓存代理层,就像Zeus的书所建议的那样。我使用Varnish获得了良好的结果。理想情况下,您会在自己的硬件上运行缓存代理,但是您也可以在现有服务器上运行它。
动态页面
动态页面更难以缓存,因此需要集中精力尽可能地提高页面本身的效率。这基本上意味着寻找瓶颈——在大多数系统中,瓶颈是数据库(但并非总是如此)。
如果您确信瓶颈是数据库,则有几种缓存选项——您可以缓存HTML的“片段”,或者您可以缓存数据库查询。使用加速器可以帮助解决此问题——我不会从头开始发明一个。这可能意味着重新架构应用程序的(部分)内容。

2

首先,您需要对您的网站进行分析。

不能仅凭直觉来判断瓶颈问题,必须确定特定的瓶颈并解决它。

缓存不是万能解决方案,也不是优化的代名词。
有时缓存无法应用(例如广告),有时它不会产生任何帮助,因为网站缓慢的原因可能是在某个不相关的位置。
您的网站可能会耗尽内存。因此,内存缓存会使事情变得更糟。

我无法相信有人拥有高流量的网站却没有考虑过先前的分析。你怎么能在一无所知的情况下运行它?CPU负载、内存负载、磁盘I/O等等。


1

我可以添加:

  • 尽可能缓存所有内容

  • 最小化包含的数量

  • 使用加速器

请调查一下是什么导致了您的网站变慢。不要忘记使用YSlow等工具,它们可以帮助您很多。

此外,如果您有大量计算需求,您可以为其编写PHP扩展,但我认为这不是您的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接