問題描述
隨着新的 WordPress 和它的新功能,似乎 WordPress 的能力遠不止一個簡單的博客引擎。但是 WordPress 的規模如何用 10k 來表示 – > 每天有 10 萬用户?
有了很多用户,它的很大一部分將是有一個良好的緩存策略,但 WordPress 開發的幫助如何,使這很容易,併為您提供所需的控制。 Fx 能夠緩存部分頁面,只能渲染用户定製的部件,支持主/從數據庫設置和類似的東西?
最佳解決方案
顯然,沒有任何尺度以及由快速 Web 服務器提供的靜態文件以及任何必須確定要加載的內容,然後加載它的 CMS 將不會執行 WordPress 或其他方式。其中一個問題是每個 URL 請求需要的數據庫查詢數量,以及我以前在 Drupal 獨家工作的 2 年工作經驗,現在 2 年以上 WordPress 是 WordPress 在該部門要好多了。
也就是説,幾乎沒有任何權力將會擴大”out-of-the-box”; 這是關於您的可擴展性需求增長可以做什麼的?
在 「大量交通」 的低端,有很好的緩存插件和廉價 CDN 的集成,您可以在 no-IT 預算和低託管預算上做得相當不錯。這裏還有一些其他問題& 回顧回顧:
- Steps to Optimize WordPress in Regard to Server Load?
- Options for CDN with WordPress Including Supporting Plugins?
- Configuring WordPress for Amazon CloudFront Caching?
有可用於分析以查明性能瓶頸的選項:
一旦出現瓶頸,您可以使用 Transient API 進行本地化優化。這個 Q& A 給出了一個可以使用 Transients API 進行優化的示例,並顯示如何:
如果你真的想要拔出大槍,你可以配置 Memcached,HyperDB,Nginx 和/或更多的東西來加速 (似乎後者正在演變成從 WordPress 中獲得驚人的可擴展性的方式):
- Enable Memcached for your WordPress
- How To Speed Up WordPress With Nginx And WP Super Cache
- HyperDB
- Nginx as a front-end proxy cache for WordPress
最後還有新興的 WordPress-focused webhosts 專門從事性能如 WP Engine,ZippyKid 等:
所以好消息是所有的規模都非常好從極低的免費和輕鬆的技術複雜性和成本只有隨着流量大幅增長而增長。從 WordPress 開始,這將是巨大的。如果你的流量不斷增長,而且你的貨幣化程度相當不錯,那麼你會發現這是很有代價的。
至少 IMO 。 🙂
次佳解決方案
- 不要期望共享託管太多 – 如果您在共享主機上,不要責怪 WordPress 緩慢。共享主機可能會將 1000 個帳户裝入一個服務器。所以你可以花一整天優化每月 10 美元的賬户,這並不重要。還要注意營銷流行語 – 只是因為它説”cloud” 並不意味着你沒有與 100 或 1000 人共享一台服務器。
- 在這一點上我不認為緩存插件是必要的。如果您查看 WP 源代碼,則已經將高級緩存放入內核。緩存的緩存緩存的緩存 – 注意,這可以適得其反。
- 減慢你的主要原因是緩慢的 MySQL 查詢和 WordPress out-of-the 盒不應該給你這裏麻煩。不過,我不得不”LIMIT” 我的評論查詢,因為我有 5 萬多條評論。 (這是固定的嗎?) 另外,如果你正在做任何非典型 (像 1000 個類別),也可能是一個問題。
- 我使用 Linode 512 與 NginX 和”top” 顯示 PHP 和 NginX 的工作在不到 1/100 秒的每個請求。幾乎所有的 CPU 時間都與 MySQL 綁定。您可以每月服務 100 萬頁,一個 20 美元的路易斯,但是一旦你開始添加插件和照片,我想你將需要一個”1GB” 線性碼。從我的角度來看,它幾乎是線性的:如果瀏覽量是雙倍的,只是你的 Linode 的大小的兩倍。
免責聲明:我不為 Linode 工作。
更新 (〜 2 年後),因為你想用 PHP 緩存頁面的一部分,這裏是一個簡單的解決方案,我使用這是非常快的。我在 1/100 秒內每頁緩存幾個單獨的部分/部分。看起來像一個 ramdisk 可以使這更快,但它是很快我的需要:
$cache_file = "./cache/portion-1". $since; // maybe round() this $since timestamp
$cache_life = 1000; // seconds to keep this cached
$filemtime = filemtime($cache_file); // returns FALSE if file does not exist
if (!$filemtime or (time() - $filemtime >= $cache_life)) {
// heavy lifting starts
$output = 'Heavy!';
// heavy lifting ends
if (!file_put_contents($cache_file,$output,LOCK_EX)) { echo 'error'; } // save the cache
echo $output;
} else {
// load from cache
$output = file_get_contents($cache_file);
echo $output;
}
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。