Selain menginstal W3 Total Cache atau plugin caching lain langkah apa yang bisa saya ambil untuk memastikan bahwa tema dan situs saya berjalan secepat mungkin.
Selain menginstal W3 Total Cache atau plugin caching lain langkah apa yang bisa saya ambil untuk memastikan bahwa tema dan situs saya berjalan secepat mungkin.
Jawaban:
Anda dapat menginstal WordPress di Nginx. Ada sejumlah sumber daya untuk membantu:
Beberapa informasi kinerja dari tautan terakhir (yang tampaknya sedikit berbeda dari yang lain):
Jadi saya memutuskan untuk meletakkan proxy di depan wordpress ke cache statis sebanyak mungkin. SEMUA lalu lintas yang tidak diautentikasi dilayani langsung dari cache file nginx, menerima beberapa permintaan (seperti pembuatan umpan RSS) dari 6 halaman / detik hingga 7000+ halaman / detik. Oof. Nginx juga menangani pencatatan dan gzipping, membuat cache backend yang lebih berat untuk melakukan yang terbaik: melayani halaman wordpress dinamis hanya jika diperlukan.
...
Di nginx - sangat efisien, menakutkan. Saya belum pernah melihatnya menggunakan lebih dari 10 hingga 15 meg RAM dan blip CPU, bahkan di bawah beban terberat kami. Grafik ganglia kami tidak berbohong: kami membagi dua kebutuhan memori kami, menggandakan throughput jaringan keluar kami dan benar-benar meratakan beban kami. Kami pada dasarnya tidak memiliki masalah sejak kami mengatur ini.
Atur expiries sisi klien untuk hal-hal seperti css, gambar, JavaScript dll yang tidak perlu diunduh ulang untuk setiap tampilan halaman. Sejauh ini, ini membuat perbedaan terbesar pada waktu pemuatan situs saya. Unduhan tercepat adalah unduhan yang tidak pernah terjadi ...
# 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
Anda dapat melakukan pre-gzip semua yang Anda bisa (7-zip adalah alat yang bagus untuk ini) & mengunggahnya di tempat yang sama dengan file yang baru saja Anda gzip. Ubah .htaccess untuk menyajikan file yang sudah di-gzip, seperti di bawah ini. Peringatan di sini adalah Anda harus ingat untuk melakukan gzip kembali jika / ketika Anda memperbarui sesuatu. Ini memotong overhead CPU, selain parsing .htaccess.
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]
Ini hanya jawaban mentah. Ada banyak variasi pada tema ini. Saya membuat blog tentang hal ini dan menambahkan beberapa referensi ke artikel yang lebih mendalam di http://icanhazdot.net/2010/03/23/some-wordpress-stuff/ . Baca itu dan, yang lebih penting, referensi yang saya tunjukkan - itu adalah sumber yang bagus.
Ketahuilah bahwa jika Anda sering mengotak-atik pengguna perlu menyegarkan cache mereka.
Plugin yang saya temukan sangat berguna juga adalah wp-minify . Yang perlu diperhatikan dengan hal ini adalah Anda harus mengecualikan item spesifik halaman (formulir kontak, slider halaman depan, dll) sehingga Anda tidak mengunduh ulang seluruh rangkaian css, JS dll untuk setiap halaman. Ini adalah cara yang baik untuk meminimalkan, menggabungkan & mengompresi CSS dasar Anda, JS dll. Ini mengurangi banyak permintaan http. Wp-minify bermain baik dengan supercache dan juga dengan header kedaluwarsa yang saya perinci di atas.
Gunakan Yslow di Firebug (Firefox) atau yang serupa untuk memantau permintaan http Anda dan apa yang dikompresi dan tidak. Lihat header kedaluwarsa di sana juga. Anda akan segera melihat apa yang dapat Anda tingkatkan.
Minimalkan jumlah plugin yang Anda jalankan hanya untuk apa yang benar-benar Anda butuhkan. Berhati-hatilah dengan plugin yang menambahkan kode javascript dan CSS pada setiap halaman, bahkan ketika kode itu tidak digunakan pada halaman tersebut.
Jika Anda membuat tema Anda sendiri dari awal, pisahkan CSS Anda sehingga fitur yang hanya perlu untuk templat halaman tertentu atau jenis tampilan (posting tunggal, arsip, kategori, dll) hanya dimuat saat diperlukan.
Konfigurasikan W3TC untuk menggunakan CDN (seperti Amazon CloudFront, atau yang lainnya yang didukung oleh W3TC).
Lihat apakah opsi Minify berfungsi untuk Anda (beberapa plugin menghasilkan js / css yang tidak akan melakukan minify dengan baik, jadi pastikan untuk menguji situs Anda setelah mengaktifkan fitur minify).
Jika Anda memiliki kontrol penuh terhadap server MySQL Anda, pastikan Anda telah mengaktifkan query_cache. Gunakan skrip tuning MySQL untuk menemukan cara lain untuk mengoptimalkan konfigurasi basis data Anda.
Jika menggunakan CDN bermasalah karena beberapa alasan, konfigurasikan mod_expires di pengaturan apache Anda. Atur waktu kedaluwarsa selama masuk akal untuk jenis statis seperti gambar, css, javascript, video, audio, dll.
Jalankan memcached dan gunakan cache objek untuk mengurangi jumlah kueri basis data. Ini cache data dari database, bukan halaman. Tidak yakin apakah w3-total-cache sudah melakukan ini.
Pastikan Anda menjalankan opcode cache seperti APC . (Ada beberapa lagi yang tersedia.)
Selain menggunakan plugin caching disk seperti wp-cache, letakkan blog Anda di volume host yang memiliki properti "noatime" di atasnya. Jika tidak, SSH ke host Anda (jika hosting Anda menyediakannya) dan jalankan perintah ini secara rutin pada file Anda setiap beberapa hari:
chattr -R +A ~/*
~ / * Berarti "file saya di bawah direktori home saya". Anda dapat mengubah jalur itu sesuai keinginan Anda. Anda juga dapat mengatur ini di pekerjaan cron di cpanel jika hosting Anda menyediakannya.
Untuk info lebih lanjut tentang properti atime, lihat ini . Ini mempercepat kinerja membaca disk Linux sangat.
Terkadang situs Anda dipalu oleh laba-laba. Anda dapat menggunakan alat seperti SpyderSpanker atau Chennai Central untuk memfilter spider yang tidak membantu membawa peringkat halaman lebih banyak ke situs Anda dan hanya memperlambatnya, dan kemudian memperlambat spider yang baik (seperti Google, Bing, dll.) Dengan mengirimkannya secara acak HTTP 304 Tidak Dimodifikasi pesan.
Hal lain yang saya lihat adalah plugin yang ditulis dengan buruk. Jika Anda belajar cara membuat plugin, Anda mulai melihat bagaimana beberapa plugin dikodekan dengan tidak efisien, atau bahkan menemukan bom waktu, seperti tabel database yang mengisi dan mengisi dan tidak pernah dibersihkan, menyimpan hal-hal seperti data koneksi yang masuk.
Di luar semua solusi lain di sini, Anda juga dapat membuat kebun web WordPress dari blog Anda dengan hosting di beberapa PC node web yang semuanya terhubung kembali ke satu basis data tunggal dan satu volume disk tunggal untuk file (seperti volume yang dipasang di atas NFS ). Lihat Ultra Monkey untuk mengetahui cara menjalankan semuanya.
Beberapa jawaban dari atas kepala saya:
1) Minimalkan jumlah permintaan HTTP yang harus dilakukan browser ke host Anda dengan menggabungkan JavaScript dan CSS jika memungkinkan / praktis.
2) Turunkan sebanyak mungkin gambar / media Anda ke CDN pihak ke-3, terutama jika Anda menggunakan hosting bersama.
3) Coba kurangi jumlah posting yang Anda tampilkan di halaman depan untuk mengurangi waktu render total.
3a) Coba gunakan tema yang menyajikan beberapa posting fitur secara penuh di halaman depan dan semua posting yang lebih tua lainnya sebagai kutipan.
Caching Menu WordPress juga memberi Anda peningkatan kinerja. Terutama jika Anda memiliki banyak Halaman atau Struktur Menu raksasa, ini harus dipertimbangkan.
Lakukan dengan 2 langkah mudah. Pada awalnya, buat fungsi yang mendapat atau membuat menu, alih-alih menelepon wp_nav_menu
langsung.
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
}
}
Dalam tema Anda, ganti wp_nav_menu
dengan get_cached_menu
. Sekarang, setiap kali menu dipanggil, Anda memiliki satu Databasequery alih-alih seluruh Menubuilding.
Menu tidak sering berubah - tetapi Anda juga harus melakukan wp_update_nav_menu
tindakan untuk menghapus transien lama.
Lakukan seperti ini:
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 );
}
Menu akan dibuat saat halaman berikutnya dipanggil - dan menggunakan versi cache hingga seseorang memperbarui menu lagi.
Versi terbaru
Terima kasih @helgatheviking karena menunjukkan kesalahan antara siput dan ID. Saya memperbarui fungsi sehingga berfungsi baik dengan theme_position
dan menu
(untuk panggilan langsung menu).
Menu selalu disimpan dengan nama Menu, bukan posisi di Theme.
$nav_menu_selected_id
adalah angka, sementara saat memanggil get_cached_menu()
itu menu_id
adalah variabel string, karena parameter itu menjadi ID CSS untuk <ul>
elemen.
Gunakan kelas basis data yang dipangkas untuk optimasi. Kami membuat pengalaman yang baik dengan kode sendiri untuk mengurangi penggunaan memori dan kecepatan akses basis data. Di samping itu, Anda dapat mengoptimalkan struktur basis data itu sendiri dengan beberapa perubahan kecil yang juga banyak.
Bagian dari kode kelas database dapat ditemukan di wordpress trac, itu tidak membuatnya menjadi inti ( Tiket # 11799 dan terkait ).
Untuk situs yang sangat diperdagangkan, Anda harus menyetel semua buffer MySQL untuk konten yang ada sekarang. Terlepas dari versi WordPress, lapisan MySQL dapat dikonfigurasikan konfigurasinya .
Bahkan, jika Anda memiliki data InnoDB tanpa mengaktifkan innodb_file_per_table, Anda perlu membersihkan InnoDB dengan mengelompokkan setiap tabel ke dalam tablespace fisiknya sendiri . Dimungkinkan untuk melakukan penyetelan MySQL yang layak bahkan jika Anda memiliki perangkat keras terbatas . Ada banyak skenario untuk melakukan optimasi InnoDB tersebut .
IMHO, Anda tidak dapat merencanakan pengaturan yang baik untuk my.cnf tanpa mengetahui jumlah data yang harus dikonfigurasi. Anda harus secara berkala memuat dataset saat ini dari produksi ke dalam lingkungan pementasan, melakukan optimisasi, dan mendapatkan nomor-nomor yang akan dikonfigurasi di my.cnf dari server produksi.
Anda dapat mengaktifkan kompresi keluaran global . ini akan mem-gzip semua yang keluar secara otomatis jika browser mendukungnya. Ini secara drastis mengurangi ukuran file yang ditransfer, tetapi meningkatkan beban CPU Anda.
Saya baru-baru ini berbicara tentang hal ini di WordCamp Houston . Semua rekomendasi di atas bagus dan yang penting adalah untuk memastikan semua hal front-end sepenuhnya dioptimalkan maka Anda dapat mulai bekerja pada caching dan masalah kinerja server.
Render progresif akan membuat halaman Anda terasa lebih cepat karena pengguna akan melihat konten halaman sebelum dimuat penuh. Untuk melakukan ini, pastikan semua pemblokiran js ada di bagian paling bawah halaman dan css ada di bagian atas.
Juga jika Anda menggunakan banyak tombol media sosial, Anda dapat menyesuaikan skrip untuk membuatnya memuat dalam iframe setelah halaman dimuat penuh. Saya menulis tutorial tentang cara melakukannya dengan tombol tweet TweetMeMe (sekarang sudah usang karena Twitter merilis tombol retweet mereka sendiri) tetapi masih dapat diterapkan ke tombol berbagi lainnya.
Untuk kinerja server, lihat Nginx sebagai proksi ujung depan untuk konten statis dengan Apache menangani PHP dan MySQL yang berat.
Karena belum ada yang menyebutkannya, salah satu langkah paling penting untuk meningkatkan kinerja server bersama dengan pengaturan LAMP adalah beralih ke utas apache pekerja dan mod_fcgid.
Ini membebaskan memori 500MB di server pribadi virtual saya.
Ada plugin yang sangat sederhana bernama Page Load Time , yang menambahkan timer ke footer halaman Anda. Sebenarnya hanya empat baris kode:
<?php
function ur_pageload_footer() {
printf(__('Page in %s seconds', 'pageload'), timer_stop());
}
add_action('wp_footer', 'ur_pageload_footer')
Kemudian:
Spreadsheet Anda akan terlihat seperti
+-------+-------+-------+-------+--------+
| Run 1 | Run 2 | Run 3 | Order | Plugin |
Jadi jika setelah menonaktifkan plugin waktu respons halaman meningkat secara signifikan maka Anda dapat melihat apakah Anda dapat menghindari plugin itu.
Saya menemukan dua plugin yang menyebabkan mqtranslate 'signifikan' memperlambat dan Plugin Navigasi Multi-level (yang agak tua tapi bagus) .
Tetap menggunakan plugin W3 Total Cache untuk fungsionalitas caching di WordPress. Aktifkan caching halaman dan caching basis data dari halaman pengaturan plugin. Pastikan Anda memilih 'Cache PHP Alternatif (APC / APCu)' sebagai mekanisme caching. JANGAN aktifkan minifikasi apa pun di W3 Total Cache karena ada banyak peluang bagi Anda untuk merusak tampilan dan / atau fungsionalitas situs Anda. Kami akan menyerahkannya ke Cloudflare.
Setelah selesai mengonfigurasi sisa fungsi plugin, siapkan Cloudflare untuk situs web Anda. Pastikan Anda mengaktifkan Cloudflare di pengaturan W3 Total Cache juga di bawah 'Extensions'.
Cloudflare adalah Jaringan Pengiriman Konten yang menyimpan semua konten statis (file gambar, CSS, JS, dokumen, dll.) Dari situs Anda dan menyajikannya kepada pengunjung Anda dari server global mereka. Ini dapat membantu mempercepat waktu pemuatan halaman dan mengurangi beban di server Anda. Untuk daftar tipe file yang di-cache oleh Cloudlfare, checkout daftar ini . Apalagi Cloudflare memiliki paket gratis.
Di Cloudflare, atur level caching ke standar dan atur cache cache menjadi sesuatu yang setidaknya lebih dari 20 jam. Aktifkan Always Online ™ sehingga meskipun server Anda turun, Cloudflare akan menyajikan halaman statis situs web Anda dari cache mereka. Juga aktifkan fitur auto minify (ingat mengapa saya meminta Anda untuk tidak mengaktifkan minification adalah W3 Total Cache? Karena Cloudflare melakukannya dengan lebih baik!) Kemudian atur Rocket Loader ™ ke otomatis.
Berikut kutipan dari apa yang dilakukan Rocket Loader:
Mengurangi jumlah permintaan jaringan dengan menggabungkan file JavaScript, bahkan sumber daya pihak ketiga, untuk menghindari memperlambat rendering halaman.
Memuat skrip secara tidak sinkron, termasuk skrip pihak ketiga, sehingga skrip tersebut
tidak memblokir konten halaman Anda untuk
segera dimuat .
Menyalin skrip secara lokal (menggunakan LocalStorage, tersedia di sebagian besar
browser dan ponsel pintar) sehingga tidak diambil ulang kecuali
diperlukan.
Informasi lebih lanjut dapat ditemukan di sini .
Jika mungkin beralih ke kerangka kerja Genesis untuk WordPress karena mereka bersih tanpa mengasapi apapun . Genesis dibangun dengan mempertimbangkan kecepatan dan SEO. Saya sendiri telah mengujinya dan skor PageSpeed saya bagus. Juga jika Anda menggunakan Genesis, maka jangan lupa untuk mengaktifkan cache fragmen dalam pengaturan W3 Total Cache.
Karena sekarang Anda menggunakan Cloudlfare sebagai CDN, Anda dapat menggunakan plugin seperti ' Imagify ' atau ' Compres JPEG & PNG images ' oleh TingPNG untuk mengompres gambar Anda. Keduanya adalah plugin gratis yang tersedia di repositori plugin WordPress.org. Juga, Imagify mendukung algoritma kompresi lossy yang kuat.
Terakhir, instal plugin ' Hapus Kueri Dari Sumber Daya Statis ' dari repositori WordPress sehingga menghapus string kueri dari sumber daya statis seperti file CSS & JS. Ini karena sumber daya dengan "?" Atau "&" di URL tidak di-cache oleh beberapa server caching proxy (ingat, Cloudflare juga merupakan server caching proxy).
Kemudian instal plugin ' Gunakan Google Perpustakaan '. Plugin ini memungkinkan situs WordPress Anda untuk menggunakan Google AJAX Library API CDN daripada melayani file-file ini dari instalasi WordPress Anda secara langsung.
Beberapa manfaatnya adalah:
Terakhir tetapi tidak kalah pentingnya, gunakan plugin ' WP-Optimize ' oleh Ruhani Rabin untuk membersihkan dan mengoptimalkan basis data Anda.
Semoga ini menjawab pertanyaan Anda sehubungan dengan mengoptimalkan WordPress untuk mengurangi beban server.