Saya melihat dari dekat pada konsumsi memori Wordpress. Di situs saya, tampaknya setiap halaman mencapai 20MB RAM dialokasikan, hanya untuk mempersiapkan lingkungan yang nyaman untuk semua plugin untuk dijalankan. Saya merencanakannya sebagai berikut:
Tidak ada satu pun tempat untuk dioptimalkan, tidak ada satu pun orang jahat yang makan sebagian besar memori. Konsumsi semua tersebar di banyak banyak modul php.
Bagaimana kita bisa membuat Wordpress menginisialisasi lingkungannya dalam memori hanya sekali, dan kemudian menggunakannya kembali berkali-kali untuk setiap klik? Saya tidak ingin PHP lambat memakan 20 MB di setiap klik pengguna - bahkan pada server dengan banyak memori, perlu beberapa detik untuk menyelesaikan semua pekerjaan. Pada dasarnya Anda membutuhkan potongan memori hanya baca yang dapat digunakan kembali.
Juga ... mengapa 20MB? Adakah yang bisa memberikan wawasan tentang ini?
Sunting: Ini adalah output WinCacheGrind di Wordpress yang berjalan di mesin pengembangan saya (jauh lebih cepat dari shared hosting). Seperti yang Anda lihat, dibutuhkan lebih dari sedetik untuk menghasilkan HTML halaman utama. Lambatkan itu dengan shared hosting dan Anda memiliki resep untuk masalah. Saya memilih metode yang menghabiskan sebagian besar waktu. Bagaimana cara Anda mengoptimalkan ini?
Sunting: Berikut ini adalah statistik kueri dari alat profil.fp yang fantastis ini .
Muat: 12 kueri - 532ms - 19.1MB - 43 hit cache / 53 Permintaan: 15 pertanyaan - 563ms - 19.0MB - 72 hit cache / 86 Tampilan: 21 kueri - 705ms - 19.2MB - 234 hit cache / 257
Sunting: Apakah Anda ingin melihat sesuatu yang dijamin membuat Anda takut? Masukkan baris ini di akhir index.php:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
Saya mencoba menghitung berapa kali isi postingan saat ini disimpan dalam memori. Saya menghitung 20 contoh. Kemudian saya menyadari bahwa PHP memiliki penghitungan referensi, sehingga jumlah salinan dikurangi menjadi hanya tiga: dua tampaknya dalam WP_Query, satu di cache objek. Saya sedang menyelidiki lebih lanjut.
Inilah mengapa saya pikir WordPress perlu refactoring menargetkan masalah memori. Anda tidak dapat lagi menyalahkan konsumsi memorinya pada kerumitan semata dari apa yang dilakukannya. Itu hanya melakukan banyak hal yang salah .
Sunting: Setelah seharian mencoba mencari tahu ini, berikut adalah temuan saya:
1) 88% dari semua memori berasal dari permintaan atau sertakan atau sertakan jenis panggilan:
2) File php termasuk sebagian besar terjadi selama bagian pertama melayani permintaan (tidak mengherankan), yang juga merupakan tempat semua memori habis:
3) Cukup menarik untuk memplot semua fungsi yang sedang dieksekusi saat membuat permintaan. Ada total lebih dari 12000 panggilan. Saya gugup agar lebih terlihat (sumbu Level pada dasarnya adalah kedalaman tumpukan):
4) Satu-satunya cara maju yang dapat saya pikirkan adalah meminimalkan jumlah file .php yang disertakan. Jika saya membagi fungsi per file asalnya, Anda dapat melihat bahwa banyak file paling banyak dipukul sekali atau dua kali. Kita perlu cara bagaimana melompati mereka ketika mereka tidak diperlukan. Misalnya plugin cadangan basis data jauh saya dimuat dan terdaftar, hanya untuk tidak pernah digunakan sama sekali. Berikut adalah plot di atas dengan nama file:
Saya menawarkan hadiah yang layak untuk semua reputasi saya :) untuk refactor yang akan menyebabkan pemotongan jejak memori blog saya hingga 30% atau lebih.
Sunting: Saya menginstal WP 3.1, ini adalah perbandingan dengan versi yang lama.
Biru adalah WP 3.1, merah adalah 3.0.4. WP baru lebih cepat, tetapi juga memakan lebih banyak memori.
Berikut adalah daftar dengan memasukkan file.
Ini biarkan saya menyadari betapa banyak memori yang dimakan oleh "paket SEO All In One" - satu jalan adalah dengan menggunakan hanya sebagian kecil dari fungsi plugin untuk mendapatkan apa yang saya inginkan. Juga, plugin saya sendiri sepertinya sangat buruk.
Saya ingin mencoba memuat bersyarat pada misal comment.php (saya melarang komentar di blog saya) dan beberapa lainnya. Saya menghapus semua kode yang sudah usang. Saya memangkas kses.php untuk hanya memuat tabel globalnya sesuai permintaan. Saya menyederhanakan l10n (saya tidak melakukan pelokalan), membuat fungsinya mengembalikan string segera, tanpa pencarian. Saya masih jauh dari angka 30% yang saya set up secara sewenang-wenang.
Sunting: Saya mengunduh dan mengaktifkan APC dengan pengaturan default (32MB cache opcode). Berikut ini perbandingannya:
Anda dapat melihat bahwa pemuatan kode dipercepat secara besar-besaran, dan kode juga membutuhkan lebih sedikit ruang dalam memori (mungkin karena kita hanya berurusan dengan opcodes, bukan sumber aslinya). Namun konsumsi memori masih cukup tinggi.