问题描述

除了安装 W3 Total Cache 还是另一个缓存插件,我可以采取哪些步骤来确保我的主题和站点尽可能快地运行。

最佳解决方案

您可以在 Nginx 上安装 WordPress 。有一些资源可以帮助:

来自最后一个链接的一些性能信息 (与其他链接似乎有点不同):

So I decided to put a proxy in front
of wordpress to static cache as much
as possible. ALL non-authenticated
traffic is served directly from the
nginx file cache, taking some requests
(such as RSS feed generation) from 6
pages/second to 7000+ pages/second.
Oof. Nginx also handles logging and
gzipping, leaving the heavier backend
apaches to do what they do best: serve
dynamic wordpress pages only when
needed.

On nginx – it’s so efficient it’s
scary. I’ve never seen it use more
than 10 to 15 meg of RAM and a blip of
CPU, even under our heaviest load. Our
ganglia graphs don’t lie: we halved
our memory requirements, doubled our
outgoing network throughput and
completely leveled out our load. We
have had basically no problems since
we set this up.

次佳解决方案

将 client-side 设置为 css,image,JavaScript 等等,不需要为每个页面视图重新下载。这到目前为止,我的网站加载时间最大的不同。最快的下载是从未发生的下载…

# BEGIN Expire headers
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 7200 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 2592000 seconds"
  ExpiresByType text/javascript "access plus 2592000 seconds"
  ExpiresByType application/x-javascript "access plus 2592000 seconds"
  ExpiresByType text/html "access plus 7200 seconds"
  ExpiresByType application/xhtml+xml "access plus 7200 seconds"
</IfModule>
# END Expire headers

# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
  <FilesMatch ".(ico|jpe?g|png|gif|swf|gz)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch ".(css)$">
    Header set Cache-Control "max-age=2592000, public"
  </FilesMatch>
  <FilesMatch ".(js)$">
    Header set Cache-Control "max-age=2592000, private"
  </FilesMatch>
<filesMatch ".(html|htm)$">
Header set Cache-Control "max-age=7200, public"
</filesMatch>
# Disable caching for scripts and other dynamic files
<FilesMatch ".(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
</IfModule>
# END Cache-Control Headers

你可以 pre-gzip 你可以合理的一切 (7-zip 是一个很好的工具) 将其上传到与您刚刚压缩的文件相同的位置。更改.htaccess 以提供 pre-gzipped 文件,如下所示。这里需要注意的是,如果/当您更新内容时,需要记住 re-gzip 。除了解析.htaccess 之外,这会削减 CPU 开销。

RewriteEngine on
#Check to see if browser can accept gzip files. If so and we have it - serve it!
ReWriteCond %{HTTP:accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
#make sure there's no trailing .gz on the url
ReWriteCond %{REQUEST_FILENAME} !^.+.gz$
#check to see if a .gz version of the file exists.
RewriteCond %{REQUEST_FILENAME}.gz -f
#All conditions met so add .gz to URL filename (invisibly)
RewriteRule ^(.+) $1.gz [QSA,L]

这只是一个原始的答案。这个主题有很多变化。我发表了这篇文章,并在 http://icanhazdot.net/2010/03/23/some-wordpress-stuff/中增加了更多的 in-depth 文章。阅读更重要的是,我指出的参考资料 – 他们是好的资源。

请注意,如果您经常修补,则用户将需要刷新其缓存。

一个我发现非常有用的插件是 wp-minify 。用这个观看的东西是你应该排除 page-specific 项目 (联系表单,首页滑块等),所以你不是 re-downloading 的每一页的整套 css,JS 等。这是一个很好的方法来缩小,组合和压缩您的基准 CSS,JS 等。它减少了 http 请求很多。 Wp-minify 与超级缓存一起播放以及上面详细介绍的到期标题。

在 Firebug(Firefox) 或类似的应用程序中使用 Yslow 可以监视您的 http 请求,以及什么是和未压缩的。看看那里的到期标题。你很快会看到你能改善什么。

第三种解决方案

最小化您运行的插件数量,只有您真正需要的插件数量。特别要注意的是,即使在页面上没有使用该代码的插件,也可以在每个页面加载 JavaScript 和 CSS 代码。

如果你是从头开始创建自己的主题,打破下来你的 CSS,以便在需要时只需要为特定的页面模板或视图类型 (单后,档案,类别等) 功能只加载。

配置 W3TC 使用 CDN(如 Amazon CloudFront 或 W3TC 支持的其他任何一个) 。

看看 Minify 选项是否适合你 (某些插件生成不会很好地缩小的 js / css,所以一定要在激活 minify 功能后测试你的网站) 。

如果您完全控制了 MySQL 服务器,请确保已启用 query_cache 。使用 MySQL tuning script 找到其他方法来优化您的数据库配置。

如果使用 CDN 由于某些原因是有问题的,请在 apache 设置中配置 mod_expires 。为静态类型 (如图像,CSS,JavaScript,视频,音频等) 设置有效期限。

第四种方案

运行 memcached 并使用 object cache 来减少数据库查询的数量。这将缓存来自数据库的数据,而不是页面。不知道 w3-total-cache 是否已经这样做了。

确保您正在运行像 APC 这样的操作码缓存。 (还有几个可用。)

第五种方案

除了使用像 wp-cache 这样的磁盘缓存插件之外,将您的博客放在其上设置了”noatime” 属性的主机卷上。否则,SSH 进入您的主机 (如果您的 Webhost 提供),并且每隔几天定期在您的文件上运行此命令:

chattr -R +A ~/*

〜/ *表示 “我的目录下的文件” 。您可以根据需要更改该路径。如果您的 webhost 提供了这一点,您还可以在 cpanel 中的 cron 作业中进行设置。

有关 atime 属性的更多信息,请参阅 this 。它大大加快了 Linux 磁盘读取性能。

有时你的网站被蜘蛛打了。您可以使用像 SpyderSpanker 或 Chennai Central 这样的工具来筛选出无法为您的网站带来更多页面排名的蜘蛛,并将其放慢速度,然后通过发送它们来排除好蜘蛛 (如 Google,Bing 等) HTTP 304 未修改消息。

我看到的另一件事就是写得不好的插件。如果您学习如何创建插件,您将开始看到一些插件的编码效率低下,甚至找到时间空间,例如填充和填充并从未被清除的数据库表,存储诸如传入连接数据之类的东西。

除了这里的所有其他解决方案之外,您还可以通过将其连接到多个网络节点 PC 上来创建您的博客的 WordPress Web 场,所有 PC 节点都连接到单个数据库,并且文件的一个磁盘卷 (例如通过 NFS 安装的卷) ) 。查看 Ultra Monkey 如何获得一切。

第六种方案

头顶上有几个答案:

1) 尽量/可行地连接 JavaScript 和 CSS,最大限度地减少浏览器对主机的 HTTP 请求数量。

2) 尽可能多地卸载与第三方 CDN 一样的图像/媒体,尤其是在使用共享主机时。

3) 尝试减少您在首页上显示的帖子数量,以减少总渲染时间。

3a) 尝试使用主题,在主页和所有其他较旧的帖子中提供一些精选帖子作为摘录。

第七种方案

缓存 WordPress 菜单还可以提升性能。特别是如果你有很多的页面或一个巨大的菜单结构,这应该被考虑。

做两个简单的步骤。首先,创建一个获取或创建菜单的功能,而不是直接调用 wp_nav_menu

function get_cached_menu( $menuargs ) {

    if ( !isset( $menuargs['menu'] ) ) {

        $theme_locations = get_nav_menu_locations();
        $nav_menu_selected_id = $theme_locations[$menuargs['theme_location']];
        $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );
        $transient = 'menu_' . $termslug->slug . '_transient';

    } else {

        $transient = 'menu_' . $menuargs['menu'] . '_transient';

    }


    if ( !get_transient( $transient ) ) { // check if the menu is already cached

        $menuargs['echo'] = '0'; // set the output to return
        $this_menu = wp_nav_menu( $menuargs ); // build the menu with the given $menuargs
        echo $this_menu; // output the menu for this run
        set_transient( $transient, $this_menu ); // set the transient, where the build HTML is saved

    } else {

        echo get_transient( $transient ); // just output the cached version

    }

}

在您的主题中,用 get_cached_menu 替换 wp_nav_menu 。现在,每次调用菜单时,都有一个 Databasequery,而不是整个 Menubuilding 。

菜单不会经常更改 – 但是您也必须挂钩到 wp_update_nav_menu 操作中以删除旧的瞬变。

像这样做:

add_action('wp_update_nav_menu', 'my_delete_menu_transients');

function my_delete_menu_transients($nav_menu_selected_id) {

    $termslug = get_term_by( 'id', $nav_menu_selected_id, 'nav_menu' );

    $transient = 'menu_' . $termslug->slug . '_transient';

    delete_transient( $transient );

}

菜单将在下一次调用页面时生成 – 并使用缓存版本,直到有人再次更新菜单。

更新版本

感谢 @helgatheviking 指出了 s s 和 ID 之间的错误。我更新了这些功能,因此它与 theme_positionmenu(用于菜单的直接调用) 一起工作。

菜单始终以菜单的名称保存,而不是主题中的位置。

第八种方案

使用被修剪以优化的数据库类。我们用自己的代码做了很好的经验,以减少内存使用和数据库访问速度。除此之外,您还可以通过一些小的更改来优化数据库结构本身。

数据库类代码的一部分可以在 wordpress trac 中找到,它没有将它变成核心 (Ticket #11799 and related) 。

第九种方案

对于高度被贩卖的网站,您应该调整所有 MySQL 缓冲区为现在的内容。无论 WordPress 的版本,the MySQL layer can have its configuration computed

实际上,如果你有 InnoDB 数据没有启用 innodb_file_per_table,you need to cleanup InnoDB by segmenting each table into its own physical tablespace 。可以做体面的 MySQL 调优 even if you have a limited hardware 。有 many scenarios for doing such InnoDB optimizations

IMHO,您不能为 my.cnf 规划好设置,而不知道要配置的数据量。您必须定期将生产中的当前数据集加载到分段环境中,执行优化,并删除在生产服务器的 my.cnf 中配置的数字。

第十种方案

您可以启用全局 output compression 。如果浏览器支持,这将 gzip 自动出现的所有内容。这大大减少了传输文件的大小,但却增加了 CPU 负载。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。