Akselerasi program PHP. Bagaimana cara mempercepat Apache: melayani file statis dan menjalankan PHP? Mengapa FastCGI tidak mempercepat PHP




Salah satu kriteria utama untuk keberhasilan sumber daya Internet apa pun adalah kecepatan kerjanya, dan setiap tahun pengguna menjadi semakin menuntut menurut kriteria ini. Optimalisasi skrip php adalah salah satu metode untuk memastikan kecepatan sistem.

Pada artikel ini, saya ingin menyajikan kepada publik kumpulan tip dan fakta saya tentang pengoptimalan skrip. Koleksinya saya kumpulkan sejak lama, berdasarkan beberapa sumber dan eksperimen pribadi.

Mengapa kumpulan tip dan fakta dan bukan aturan keras dan cepat? Karena, seperti yang saya lihat, tidak ada "pengoptimalan yang sepenuhnya benar". Banyak teknik dan aturan yang bertentangan dan tidak mungkin memenuhi semuanya. Anda harus memilih serangkaian metode yang dapat diterima untuk digunakan tanpa mengorbankan keamanan dan kenyamanan. Saya telah mengambil posisi penasihat dan oleh karena itu saya memiliki saran dan fakta yang mungkin Anda ikuti atau tidak.

Untuk menghindari kebingungan, saya membagi semua tip dan fakta menjadi 3 kelompok:

  • Optimalisasi pada level logika dan organisasi aplikasi
  • Optimalisasi kode
  • Pengoptimalan yang tidak berguna

Grup dialokasikan secara bersyarat dan beberapa item dapat dikaitkan dengan beberapa item sekaligus. Angka-angka diberikan untuk server rata-rata (LAMP). Artikel ini tidak membahas masalah yang terkait dengan keefektifan berbagai teknologi dan kerangka kerja pihak ketiga, karena ini adalah topik untuk diskusi terpisah.

Optimalisasi pada level logika dan organisasi aplikasi

Banyak tips dan fakta yang terkait dengan grup pengoptimalan ini sangat signifikan dan memberikan keuntungan waktu yang sangat besar.

  • Buat profil kode Anda secara konstan di server (xdebug) dan di klien (firebug) untuk mengidentifikasi kemacetan kode
    Perlu dicatat bahwa Anda perlu membuat profil bagian server dan klien, karena tidak semua kesalahan server dapat dideteksi di server itu sendiri.
  • Jumlah fungsi yang ditentukan pengguna yang digunakan dalam program tidak memengaruhi kecepatan sama sekali
    Ini memungkinkan Anda untuk menggunakan fungsi yang ditentukan pengguna dalam jumlah tak terbatas dalam program.
  • Manfaatkan fungsi kustom secara aktif
    Efek positif dicapai karena di dalam fungsi, operasi hanya dilakukan dengan variabel lokal. Efeknya lebih besar daripada biaya panggilan fungsi yang ditentukan pengguna.
  • Diinginkan untuk mengimplementasikan fungsi "sangat berat" dalam bahasa pemrograman pihak ketiga sebagai ekstensi PHP
    Ini membutuhkan keterampilan pemrograman dalam bahasa pihak ketiga, yang sangat meningkatkan waktu pengembangan, tetapi pada saat yang sama memungkinkan Anda menggunakan trik di luar kemampuan PHP.
  • Memproses file html statis lebih cepat daripada file php yang ditafsirkan
    Perbedaan waktu pada klien bisa sekitar 1 detik, jadi pemisahan yang jelas antara halaman statis dan halaman yang dihasilkan PHP masuk akal.
  • Ukuran file yang diproses (terhubung) memengaruhi kecepatan
    Sekitar 0,001 detik dihabiskan untuk memproses setiap 2 KB. Fakta ini mendorong kami untuk meminimalkan kode skrip saat mentransfernya ke server produksi.
  • Cobalah untuk tidak terus-menerus menggunakan require_once atau include_once
    Fungsi-fungsi ini harus digunakan jika memungkinkan untuk membaca ulang file, dalam kasus lain disarankan untuk menggunakan require dan include .
  • Saat mencabangkan algoritme, jika ada konstruksi yang tidak dapat diproses dan volumenya sekitar 4 KB atau lebih, maka lebih optimal untuk memasukkannya menggunakan include.
  • Dianjurkan untuk menggunakan validasi data yang dikirim pada klien
    Ini karena saat memvalidasi data di sisi klien, jumlah permintaan dengan data yang salah berkurang drastis. Sistem validasi data sisi klien dibangun terutama menggunakan JS dan elemen hard form (pilih).
  • Sangat diinginkan untuk membangun konstruksi DOM yang besar untuk larik data pada klien
    Ini adalah teknik pengoptimalan yang sangat efektif saat berhadapan dengan menampilkan data dalam jumlah besar. Esensinya bermuara sebagai berikut: array data disiapkan di server dan ditransfer ke klien, dan konstruksi struktur DOM disediakan untuk fungsi JS. Akibatnya, sebagian beban didistribusikan kembali dari server ke klien.
  • Sistem yang dibangun dengan teknologi AJAX jauh lebih cepat daripada sistem yang tidak menggunakan teknologi ini.
    Hal ini disebabkan penurunan volume penarikan dan redistribusi beban pada klien. Dalam praktiknya, kecepatan sistem dengan AJAX 2-3 kali lebih tinggi. Komentar: AJAX, pada gilirannya, membuat sejumlah batasan pada penggunaan metode pengoptimalan lainnya, seperti bekerja dengan buffer.
  • Saat menerima permintaan kiriman, selalu kembalikan sesuatu, bahkan spasi
    Jika tidak, halaman kesalahan akan dikirim ke klien, yang beratnya beberapa kilobyte. Kesalahan ini sangat umum terjadi pada sistem yang menggunakan teknologi AJAX.
  • Mendapatkan data dari file lebih cepat daripada dari database
    Ini sebagian besar disebabkan oleh biaya koneksi ke database. Yang mengejutkan saya, sebagian besar programmer secara gila-gilaan menyimpan semua data dalam database, bahkan saat menggunakan file lebih cepat dan nyaman. Komentar: file dapat menyimpan data yang tidak dicari, jika tidak database harus digunakan.
  • Jangan terhubung ke database jika tidak perlu
    Untuk alasan yang tidak saya ketahui, banyak pemrogram terhubung ke database pada tahap membaca pengaturan, meskipun mereka mungkin tidak membuat kueri lebih lanjut ke database. Ini adalah kebiasaan buruk yang memakan waktu rata-rata 0,002 detik.
  • Gunakan koneksi database persisten dengan sejumlah kecil klien yang aktif secara bersamaan
    Manfaat waktu disebabkan oleh tidak adanya biaya untuk koneksi ke database. Perbedaan waktunya kira-kira 0,002 detik. Komentar: dengan sejumlah besar pengguna, koneksi yang terus-menerus tidak diinginkan. Saat berhadapan dengan koneksi persisten, harus ada mekanisme untuk mengakhiri koneksi.
  • Menggunakan kueri basis data yang kompleks lebih cepat daripada menggunakan beberapa kueri sederhana
    Perbedaan waktu bergantung pada banyak faktor (volume data, pengaturan basis data, dll.) dan diukur dalam seperseribu, dan terkadang bahkan seperseratus detik.
  • Menggunakan kalkulasi sisi DBMS lebih cepat daripada kalkulasi sisi PHP untuk data yang tersimpan di database
    Hal ini disebabkan oleh fakta bahwa untuk perhitungan seperti itu di sisi PHP, diperlukan dua kueri ke database (mendapatkan dan mengubah data). Perbedaan waktu bergantung pada banyak faktor (volume data, pengaturan basis data, dll.) dan diukur dalam seperseribu dan seperseratus detik.
  • Jika data sampel dari database jarang berubah dan banyak pengguna mengakses data ini, maka masuk akal untuk menyimpan data sampel ke file
    Misalnya, Anda dapat menggunakan pendekatan sederhana berikut: kami mendapatkan data sampel dari database dan menyimpannya sebagai larik serial ke file, lalu setiap pengguna menggunakan data dari file tersebut. Dalam praktiknya, metode pengoptimalan ini dapat memberikan peningkatan kecepatan eksekusi skrip yang berlipat ganda. Komentar: Saat menggunakan metode ini, diperlukan alat tulis untuk menghasilkan dan memodifikasi data yang disimpan dalam file.
  • Data cache yang jarang berubah dengan memcache
    Perolehan waktu bisa sangat signifikan. Komentar: caching efektif untuk data statis, untuk data dinamis efeknya berkurang dan mungkin negatif.
  • Bekerja tanpa objek (tanpa OOP) sekitar tiga kali lebih cepat daripada bekerja dengan objek
    Memori yang "dimakan" juga lebih banyak. Sayangnya, interpreter PHP tidak dapat menangani OOP secepat fungsi biasa.
  • Semakin tinggi dimensi array, semakin lambat kerjanya.
    Hilangnya waktu muncul dari pemrosesan struktur bersarang.

Optimalisasi kode

Kiat dan fakta ini memberikan sedikit peningkatan kecepatan dibandingkan dengan kelompok sebelumnya, tetapi jika digabungkan, teknik ini dapat memberikan keuntungan waktu yang baik.

  • gema dan cetak secara signifikan lebih cepat daripada printf
    Perbedaan waktu bisa sampai beberapa seperseribu detik. Ini karena printf digunakan untuk menampilkan data yang diformat, dan juru bahasa memeriksa seluruh baris untuk data tersebut. printf hanya digunakan untuk menampilkan data yang perlu diformat.
  • echo $var."text" lebih cepat dari echo "$var."text"
    Ini karena mesin PHP dalam kasus kedua terpaksa mencari variabel di dalam string. Untuk data dalam jumlah besar dan versi PHP yang lebih lama, perbedaan waktu terlihat jelas.
  • echo "a" lebih cepat dari echo "a" untuk string tanpa variabel
    Ini karena dalam kasus kedua, mesin PHP mencoba mencari variabel. Untuk data dalam jumlah besar, perbedaan waktu cukup terlihat.
  • echo "a","b" lebih cepat dari echo "a"."b"
    Keluaran data yang dipisahkan koma lebih cepat daripada data yang dipisahkan titik. Ini karena penggabungan string terjadi pada kasus kedua. Untuk data dalam jumlah besar, perbedaan waktu cukup terlihat. Catatan: ini hanya berfungsi dengan fungsi gema, yang dapat mengambil banyak baris sebagai argumen.
  • $kembali="a"; $kembali.="b"; gema $kembali; lebih cepat dari gema "a"; gema "b";
    Alasannya adalah keluaran data memerlukan beberapa operasi tambahan. Untuk data dalam jumlah besar, perbedaan waktu cukup terlihat.
  • ob_mulai(); gema "a"; gema "b"; ob_end_flush(); lebih cepat dari $return="a"; $kembali.="b"; gema $kembali;
    Ini karena semua pekerjaan dilakukan tanpa mengakses variabel. Untuk data dalam jumlah besar, perbedaan waktu cukup terlihat. Komentar: teknik ini tidak efektif jika Anda bekerja dengan AJAX, karena dalam hal ini diinginkan untuk mengembalikan data sebagai satu baris.
  • Gunakan "sisipan profesional" atau? > a b
    Data statis (di luar kode) diproses lebih cepat daripada keluaran PHP. Teknik ini disebut penyisipan profesional. Untuk data dalam jumlah besar, perbedaan waktu cukup terlihat.
  • readfile lebih cepat dari file_get_contents , file_get_contents lebih cepat dari kebutuhan , dan kebutuhan lebih cepat daripada include untuk menampilkan konten statis dari satu file
    Waktu untuk membaca file kosong berfluktuasi dari 0,001 untuk readfile hingga 0,002 untuk include .
  • membutuhkan lebih cepat daripada menyertakan untuk file yang ditafsirkan
    Komentar: saat mencabangkan algoritme, jika memungkinkan untuk tidak menggunakan file yang ditafsirkan, Anda harus menggunakan include , karena memerlukan selalu menyertakan file.
  • if (...) (...) else if (...) () lebih cepat dari switch
    Waktu tergantung pada jumlah cabang.
  • if (...) (...) else if (...) () lebih cepat daripada if (...) (...); jika(...)();
    Waktu tergantung pada jumlah cabang dan kondisi. Anda harus menggunakan else jika memungkinkan, karena ini adalah konstruk "bersyarat" tercepat.
  • Kondisi paling umum dari konstruk if (...) (...) else if (...) () harus ditempatkan di awal cabang
    Penerjemah memindai struktur dari atas ke bawah hingga menemukan kondisi. Jika penafsir menemukan bahwa kondisi terpenuhi, maka tidak melihat sisa struktur.
  • < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
    Ini karena dalam kasus kedua, operasi sizeOf akan dijalankan pada setiap iterasi. Perbedaan waktu eksekusi tergantung pada jumlah elemen array.
  • x = ukuran($array); untuk($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    Perbedaan waktu signifikan dan meningkat seiring pertumbuhan array.
  • preg_replace lebih cepat dari ereg_replace , str_replace lebih cepat dari preg_replace , tetapi strtr lebih cepat dari str_replace
    Perbedaan waktu tergantung pada jumlah data dan dapat mencapai seperseribu detik.
  • Fungsi string lebih cepat daripada ekspresi reguler
    Aturan ini merupakan konsekuensi dari yang sebelumnya.
  • Hapus variabel array yang sudah tidak diperlukan untuk membebaskan memori.
  • Hindari menggunakan penekanan kesalahan @
    Penekanan kesalahan menghasilkan sejumlah operasi yang sangat lambat, dan karena tingkat pengulangan bisa sangat tinggi, kehilangan kecepatan bisa menjadi signifikan.
  • if (isset($str(5))) (...) lebih cepat daripada if (strlen($str)>4)(...)
    Ini karena operasi pemeriksaan isset standar digunakan alih-alih fungsi string strlen .
  • 0,5 lebih cepat dari 1/2
    Alasannya adalah dalam kasus kedua, operasi pembagian dilakukan.
  • return lebih cepat daripada global saat mengembalikan nilai variabel dari suatu fungsi
    Ini karena dalam kasus kedua, variabel global dibuat.
  • $row["id"] lebih cepat dari $row
    Opsi pertama 7 kali lebih cepat.
  • $_SERVER['REQUEST_TIME'] lebih cepat dari time() untuk menentukan kapan skrip harus dijalankan
  • if ($var===null) (...) lebih cepat daripada if (is_null($var)) (...)
    Alasannya adalah tidak ada penggunaan fungsi pada kasus pertama.
  • ++i lebih cepat dari i++ , --i lebih cepat dari i--
    Ini karena fitur inti PHP. Perbedaan waktu kurang dari 0,000001, tetapi jika Anda mengulangi prosedur ini ribuan kali, lihat lebih dekat pengoptimalan ini.
  • Penambahan variabel yang diinisialisasi i=0; ++i; lebih cepat daripada ++i yang tidak diinisialisasi
    Perbedaan waktu sekitar 0,000001 detik, tetapi karena kemungkinan frekuensi pengulangan, fakta ini harus diingat.
  • Menggunakan variabel "bekas" lebih cepat daripada mendeklarasikan yang baru
    Atau untuk mengulanginya secara berbeda - Jangan membuat variabel yang tidak perlu.
  • Bekerja dengan variabel lokal lebih cepat dibandingkan dengan variabel global sekitar 2 kali lipat
    Meskipun perbedaan waktunya kurang dari 0,000001 detik, karena tingkat pengulangan yang tinggi, Anda harus mencoba bekerja dengan variabel lokal.
  • Mengakses variabel secara langsung lebih cepat daripada memanggil fungsi di mana variabel ini didefinisikan beberapa kali
    Dibutuhkan sekitar tiga kali lebih banyak waktu untuk memanggil fungsi daripada memanggil variabel.

Pengoptimalan yang tidak berguna

Sejumlah metode pengoptimalan dalam praktiknya tidak berdampak besar pada kecepatan eksekusi skrip (perolehan waktu kurang dari 0,000001 detik). Meskipun demikian, pengoptimalan semacam itu sering menjadi kontroversi. Saya membawa fakta-fakta "tidak berguna" ini agar Anda tidak memberikan perhatian khusus padanya saat menulis kode nanti.

  • gema lebih cepat daripada cetak
  • include("absolute path") lebih cepat daripada include("relative path")
  • sizeOf lebih cepat dari hitungan
  • foreach ($arr as $key => $value) (...) lebih cepat dari reset($arr); while (list($key, $value) = each ($arr)) (...) untuk array asosiatif
  • Kode yang tidak dikomentari lebih cepat daripada kode yang dikomentari karena membutuhkan waktu ekstra untuk membaca file
    Sangat bodoh untuk mengurangi volume komentar demi pengoptimalan, Anda hanya perlu meminimalkannya dalam skrip ("pertempuran") yang berfungsi.
  • Variabel dengan nama pendek lebih cepat daripada variabel dengan nama panjang
    Ini karena pengurangan jumlah kode yang diproses. Mirip dengan poin sebelumnya, Anda hanya perlu meminimalkannya dalam skrip kerja (“pertempuran”).
  • Markup kode menggunakan tab lebih cepat daripada menggunakan spasi
    Mirip dengan poin sebelumnya.

Terakhir, saya ingin mengingatkan Anda sekali lagi bahwa saran dan fakta yang saya berikan tidak mutlak dan signifikansi penerapannya bergantung pada situasi spesifik. Harus diingat bahwa pengoptimalan skrip hanyalah sebagian kecil dari keseluruhan prosedur pengoptimalan dan seringkali mungkin untuk hidup tanpa tip di atas.


Jika Anda memiliki pertanyaan, silakan gunakan kami

Pada artikel ini, saya ingin memberikan beberapa tip, berikut ini Anda dapat mempercepat pemrosesan skrip PHP secara signifikan, sehingga membongkar server host dari pekerjaan yang tidak berguna demi pekerjaan yang lebih bermanfaat ...

Gunakan tanda kutip tunggal, bukan tanda kutip ganda

Faktanya adalah bahwa teks yang diapit oleh tanda kutip ganda dipindai oleh prosesor untuk keberadaan variabel di dalamnya, serta penggantian mnemonik (misalnya, \n untuk memasukkan karakter baris baru ke dalam teks).

print("Ini adalah teks yang sangat sederhana, tetapi prosesor PHP memindainya untuk variabel dan penggantian mnemonik sebelum mengeluarkannya. Dengan string yang cukup panjang, proses ini memakan banyak waktu.");

Jika teks diapit dengan tanda kutip tunggal, maka juru bahasa PHP dengan patuh menampilkannya dalam bentuk aslinya, bahkan tanpa berpikir untuk mencari sesuatu di dalamnya. Ini membutuhkan waktu jauh lebih sedikit daripada contoh sebelumnya.

print("Prosesor PHP akan sangat senang melihat string diapit tanda kutip tunggal. Bagaimana bisa Anda tidak senang - Anda tidak perlu melakukan pekerjaan sia-sia!");

Secara alami, string semacam ini dapat digunakan tidak hanya dalam fungsi, tetapi juga dalam variabel.

$string="Sungguh berkah untuk tidak mengurai string ini sekali lagi!";

Jangan sertakan variabel dalam tanda kutip

Sangat umum untuk melihat gambar seperti itu.

print("Prosesor PHP harus memproses halaman ini selama $time detik.");

Setelah mempelajari saran saya sebelumnya, dan mengetahui bahwa jauh lebih mudah bagi penerjemah PHP untuk "merekatkan" string daripada memindai variabel dan menggantinya dengan string yang sesuai untuk variabel ini, mudah ditebak bahwa contoh saya sebelumnya adalah contoh penggunaan sumber daya server yang tidak efisien. Dan sekarang mari menyenangkan server dengan skrip yang dioptimalkan.

print("Prosesor PHP dengan senang hati memproses skrip ini dalam ".$time." detik.");

Bagi yang berada di dalam tangki: pengeleman garis dilakukan dengan menggunakan titik (.), yaitu

print("Alamat situs web ini adalah http://".$_SERVER["HTTP_HOST"]."/!");

akan menampilkan teks "Alamat situs ini adalah http://argon.com.ru/!"

Gunakan variabel minimum

Anda harus selalu ingat bahwa variabel global apa pun disimpan dalam memori selama durasi skrip! Sebagai contoh ejekan server, saya akan memberikan kode berikut.

Pertanyaannya, apa sih yang menghabiskan memori ekstra, memuat server dengan sia-sia?.. Jauh lebih efisien melakukannya.

print("Prosesor PHP senang mencetak baris seperti ini.");

Jadi jika sebuah string digunakan kurang dari dua kali, menetapkan nilai string itu ke sebuah variabel adalah hal yang buruk.

Gunakan nama variabel pendek

Jika variabel dengan nama panjang yang tidak masuk akal digunakan dalam skrip, beban di server akan meningkat secara alami.

$windows_xp_edition="Profesional";
$windows_xp_build="2600";
$windows_server2003_edition="Standar";
$windows_server2003_build="3200";

Tetapi Anda juga tidak boleh memberikan nama yang terlalu ringkas - di masa mendatang, saat mengedit skrip dengan ukuran yang mengesankan, Anda akan mengingat ibu penciptanya ratusan kali, dan bukan dengan kata yang penuh kasih sayang :)

$ifa="Profesional";
$ifb="2600";
$ifc="Standar";
Sifd="3200";

Pilihan terbaik adalah memberikan nama yang ringkas namun dapat dimengerti yang tidak melebihi delapan karakter.

$wxped="Profesional";
$wxpbld="2600";
$ws2k3ed="Standar";
sws2k3bld="3200";

Gunakan fungsi bersarang

Sangat umum untuk melihat hal semacam ini.

$string=str_replace("\n"," ",$string);
$string=str_replace("\r"," ",$string);
$string=trim($string);
$string=stripslashes($string);
$string=potong($string);
$string=substr($string,0,1024);
cetak($string);

$string)))),0,1024));

Saya setuju, ini terlihat menakutkan, tetapi ada peningkatan performa yang nyata! Sangat mudah untuk membuat hal seperti itu jika Anda mulai dari akhir, setiap kali mengganti nilai yang sesuai alih-alih variabel ...

Gunakan fungsi bawaan

Saya akan memberikan contoh sederhana dari skrip yang menggantikan semua karakter HTML khusus dengan substitusi mnemonik yang sesuai.



$string=str_ganti("<","<",$string);
$string=str_replace(">"",">",$string);
cetak($string);

Hal yang sama dapat dicapai dengan menggunakan kode ini.

print(htmlspecialchars($string));

Dan itu terlihat lebih bagus, dan lebih ringan dan secara signifikan mengurangi beban di server, terutama saat memproses string yang panjang.

Satu contoh lagi. Dengan skrip ini, Anda dapat membaca konten file teks ke dalam array.

$fp=fopen("database.txt","r");
while($array=fgets($fp,1024));
fclose($fp);

Tetapi PHP memiliki fungsi file() bawaan yang sangat berguna yang melakukan hal yang persis sama, tetapi jauh lebih cepat!

file("database.txt");

Kesimpulan: jangan pernah terlalu malas untuk sekali lagi melihat referensi fungsi PHP. Saya yakin Anda akan menemukan banyak alat di sana untuk membuat hidup Anda (dan server) lebih mudah.

Gunakan fungsi Anda sendiri

Seringkali diperlukan untuk memproses beberapa baris menggunakan algoritma yang persis sama. Inilah yang dilakukan programmer yang tidak berpengalaman ...

print(substr(chop(stripslashes(trim(str_replace("\r"," ",str_replace("\n"," ", $string1))))),0,1024));
print(substr(chop(stripslashes(trim(str_replace("\r"," ",str_replace("\n"," ", $string2))))),0,1024));

Dan yang berpengalaman akan menempuh jalan yang lebih mudah.

format fungsi(&$string)(

}
cetak(format($string1));
cetak(format($string2));

Dengan demikian, Anda dapat melakukan tindakan yang sama beberapa kali, memuat server secara minimal.

Jangan membuat fitur yang tidak perlu

Misalnya, jika programmer yang cukup berpengalaman lupa atau bahkan tidak tahu tentang keberadaan fungsi bawaan yang dia butuhkan, dia dapat dengan mudah menulisnya sendiri.

fungsi optimalkan(&$string)(
$string=str_replace("&","&",$string);
$string=str_replace(""",""",$string);
$string=str_ganti("<;","<",$string);
$string=str_replace(">"",">",$string);
}
cetak(optimalkan($string));

Tapi Anda bisa bertahan dengan cara yang lebih sederhana.

print(htmlspecialchars($string);

Jangan Gunakan Fitur Ekstra

Berikut adalah contoh kode yang tidak efisien.

print("Paman saya");
print("merampok yang paling jujur...");

Tapi itu bisa sangat mudah dioptimalkan.

print("Paman saya "."dari aturan yang paling jujur...");

Rasakan perbedaan nya? Percayalah, tuan rumah dalam hal ini hanya akan berterima kasih kepada Anda atas sumber daya server yang dibebaskan ...

Gunakan fitur dengan bijak

Misalnya, skrip seperti itu.

print(ereg_replace("normal","malang",$string));

Mengaktifkan algoritme pemrosesan ekspresi reguler (POSIX) yang tidak diperlukan sama sekali. Dan server dimuat jauh lebih berat. Tapi Anda bisa meringankan nasibnya dengan mengganti fungsi rakus dengan yang kurang rakus akan sumber daya.

print(str_replace("tidak senang","senang",$string));

Jangan menarik handler sekali lagi

Diketahui bahwa semua yang terkandung di luar tag kode PHP tidak diproses oleh prosesor PHP, tetapi ditransfer begitu saja tanpa perubahan. Beberapa orang menggunakannya seperti ini.

…kepala halaman…
cetak($judul);
?>
…navigasi…

?>
…halaman kaki…

Tetapi masuk dan keluar dari mode pemrosesan PHP akan memuat server lebih banyak daripada jika ini digunakan.

print("...header halaman...".$title."...navigasi...");
include("konten dinamis");
print("...kaki halaman...");
?>

Bersambung

Sejauh ini, saya hanya membahas puncak gunung es pengoptimalan PHP. Ada kemungkinan bahwa mengikuti satu nasihat tidak akan memberikan peningkatan produktivitas yang nyata, tetapi penerapan semua aturan dasar kesopanan seorang programmer dalam kombinasi akan secara signifikan mengurangi beban pada server dan meningkatkan otoritas Anda.

Jika Anda memiliki pertanyaan atau saran, silakan hubungi.

Selamat mengoptimalkan!

Saat ini, ketika saluran Internet khusus telah menjadi norma, Anda tidak perlu terlalu khawatir tentang ukuran halaman. Namun, masih perlu diperhatikan. Jika Anda ingin mengurangi beban di server, kurangi jumlah permintaan HTTP - ada beberapa teknik untuk ini. Pelajaran ini akan mencakup beberapa trik PHP (caching, kompresi).

1. Menggabungkan file CSS dengan PHP.

Sebagai pengembang web, kami sering membagi gaya menjadi beberapa lembar gaya untuk struktur yang lebih logis dan perubahan yang mudah nantinya. Namun, hal ini meningkatkan jumlah permintaan ke server, sehingga pemuatan halaman menjadi lebih lambat. Dengan PHP, kita dapat membunuh dua burung dengan satu batu: memiliki banyak stylesheet, dan menggunakan hanya satu kueri untuk mengakses semuanya.

Persiapan

Sebelum mengoptimalkan file CSS, kita membutuhkan gaya untuk digunakan. Mari buat beberapa file gaya:

// utama.css
// CSS misalnya

tubuh (
lebar: 800px
margin: 0 otomatis;
warna: abu-abu;
}

#pembungkus(
margin-atas: 30px;
latar belakang: url(../images/cats.png);
}
// tipografi.css
// CSS misalnya

tubuh (
font-family: Arial, san-serif;
font-berat: tebal;
}

kuat (
ukuran font: 120%
}
// formulir.css
// CSS misalnya

membentuk (
posisi: relatif;
atas: 400px;
indeks-z: 99;
}

memasukkan(
tinggi: 50px;
lebar: 400px
}

Kita perlu mengekstrak konten dari semua file dan menggabungkannya dalam urutan tertentu. Jadi skrip kita harus mendapatkan nama stylesheet melalui parameter URL, buka file ini dan sambungkan.

//Mendefinisikan variabel
$cssPath = "./css/";
jika (isset($_GET["q"])) (
$berkas = $_GET["q"];
// Dapatkan array file


foreach ($file sebagai $key => $file) (
}

$cssData = "";
foreach ($file sebagai $file) (

fclose($fileHandle);
}
}
// Beri tahu browser bahwa kita memiliki file CSS
jika (isset($cssData)) (
gema $cssData;
) kalau tidak (
}
?>

//Mendefinisikan variabel
// --- CATATAN: PATHS PERLU TRAILING SLASH ---
$cssPath = "./css/";
jika (isset($_GET["q"])) (
$berkas = $_GET["q"];
// Dapatkan array file!

//Pastikan tidak ada karakter menakutkan di nama file :) .
foreach ($file sebagai $key => $file) (
$files[$key] = str_replace(array("/", "\\", "."), "", $file);
}

Kode ini menetapkan jalur ke folder gaya dan memeriksa file. Jalur ke folder harus memiliki garis miring di awal dan di akhir nama folder, jika tidak, kita akan mengalami banyak kesalahan. Selanjutnya, kami memeriksa setiap nama file dan menghapus titik dan/atau garis miring.

$cssData = "";
foreach ($file sebagai $file) (
$cssFileName = $cssPath . $berkas. ".css";
$fileHandle = fopen($cssFileName, "r");

$cssData .= "\n" . fread($fileHandle, filesize($cssFileName));
fclose($fileHandle);
}
}

Sekarang kita perlu membuat style sheet umum dari file. Untuk melakukan ini, kami menjalankan loop yang memutar melalui array file, membuka setiap file, dan menggabungkannya menjadi satu file. "\n" menambahkan baris baru untuk keteraturan dan kebersihan. Fungsi filesize() digunakan untuk mendapatkan panjang file dan diteruskan ke fread().

// Beri tahu browser bahwa kita memiliki file CSS
header("Tipe konten: teks/css");
jika (isset($cssData)) (
gema $cssData;
echo "\n\n// Dihasilkan: " . tanggal("r");
) kalau tidak (
echo "// File tidak tersedia atau tidak ada file yang ditentukan.";
}
?>

Bagian terakhir dari kode meneruskan semua gaya ke browser. Ini berarti kita perlu memberi tahu PHP bahwa kita menyampaikan informasi CSS dan bahwa PHP harus memberi tahu browser tentang hal itu. Kami melakukan ini dengan fungsi header(), dan menyetel Content-type: text/css. Selanjutnya, kami meneruskan CSS ke klien. Namun sebelum itu, kami memeriksa keberadaan gaya CSS di file. Jika tidak ada, ini berarti nama file CSS tidak ditransfer. Jika kami memiliki file, kami mentransfernya dan menambahkan pesan tentang pembuatannya.

Penyelidikan

Sekarang saatnya menguji skrip. Buat folder dan file di dalamnya. Lihatlah struktur folder di bawah ini. Jika Anda membutuhkan struktur yang berbeda, jangan lupa untuk mengubah jalurnya.

Sekarang unggah semua file ke root situs dan akses file index.php melalui browser. Anda harus disambut dengan ungkapan "File tidak tersedia atau tidak ada file yang ditentukan" (file tidak tersedia atau tidak ditentukan). Artinya, kami belum memberikan nama file yang perlu dihubungkan. Namun, kabar baiknya adalah semuanya berfungsi tanpa kesalahan. Coba kita ketik "index.php?q=main" di browser. Anda akan melihat konten file main.css di layar Anda. Jika kita perlu mengekstrak banyak file dan menggabungkannya, kita perlu mengirimkan permintaan berikut "index.php?q=main&q=forms". Seperti yang Anda lihat, kami dapat mengulang "q=" sebanyak yang kami mau. Anda dapat menggabungkan sebanyak 50 stylesheet ke dalam satu file.

Kesimpulan

Metode ini bisa sangat berguna dan memiliki banyak keuntungan. Anda dapat memiliki lembar gaya umum untuk seluruh situs, dan terpisah, misalnya, untuk halaman dengan formulir.

Perhatian: jika Anda menempatkan file index.php di folder mana pun (bukan folder CSS), maka Anda perlu menulis jalur relatif ke gambar latar seolah-olah index.php adalah style sheet Anda. Ini adalah bagaimana browser akan berpikir.

2. Menghapus baris kosong dari HTML dan CSS

Banyak dari kita menggunakan banyak baris kosong saat menulis kode. Kabar baiknya adalah string kosong di PHP tidak diteruskan ke browser. Namun, dilewatkan dalam HTML.

Baris kosong mengkonsumsi sejumlah kecil lalu lintas. Jika lalu lintas situs tinggi, jumlah kecil ini dapat tumbuh menjadi signifikan. Di sinilah PHP datang untuk menyelamatkan.

Persiapan

Di bawah ini adalah kode untuk file HTML dan CSS.

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


Hai Halaman!






Lorem Ipsum dol...



tubuh (
min-tinggi: 800px
latar belakang: hitam;
ukuran font: 18px;
}
#pembungkus(
lebar: 960px
margin: 20px otomatis;
padding: 15px
}
#tajuk h1 (
teks-indentasi: -99999em;
latar belakang: url(../gambar/header.png);

tampilan: blok;
lebar: 100%
tinggi: 48px;
}
#tubuh utama(
font-berat: tebal;
}

Keuntungan dari skrip ini adalah dapat bekerja dengan HTML dan CSS secara bersamaan. Skrip memuat file, menghapus semua baris kosong, hanya menyisakan 1 spasi agar kata-kata tidak digabungkan.

$direktoriberkas = "";
$berkas = $_GET["q"];
$ext = $namaMeledak;

// Periksa peretas
die("Peretas...!");
) kalau tidak (
//Awal


// Keajaiban ekspresi reguler

fclose($pegangan);
// data keluaran
jika ($ext == "css") (
header("Tipe konten: teks/css");
}
gema $databaru;
}
?>

Pelajari lebih lanjut tentang setiap bagian kode

Kami mendapatkan nama file dan memeriksa jenisnya. Selanjutnya, kami mengekstrak semua data dan menghapus spasi dan baris kosong. Metode ini adalah yang paling primitif dan tidak akan menghapus semua baris kosong, tetapi akan menangani sebagian besar. Dan itu hanya beberapa baris kode.

$direktoriberkas = "";
$berkas = $_GET["q"];
$namaLedakan = meledak(".", $file);
$ext = $namaMeledak;
$namafile = $direktorifile . $berkas;

Kode ini menetapkan variabel yang diperlukan. Sekali lagi, kami meneruskan semua data melalui "q". Itu juga mendefinisikan folder untuk file.

Jika ($ext != "css" DAN $ext != "htm" DAN $ext != "html") (
// Periksa peretas
die("Peretas...!");
) kalau tidak (

Di sini kami memeriksa apakah file tersebut benar-benar CSS atau HTML.

//Awal
$handle = fopen($fileName, "r");
$fileData = fread($handle, filesize($fileName));
// Keajaiban ekspresi reguler
$databaru = preg_replace("/\s+/", " ", $fileData);
fclose($pegangan);
// data keluaran
jika ($ext == "css") (

header("Tipe konten: teks/css");
}
gema $databaru;
}
?>

Kode ini membuka dan membaca file - lalu menghapus ruang putih sebanyak mungkin. Ini dicapai dengan menggunakan ekspresi reguler. Semua spasi, tab, baris kosong ditemukan dan diganti dengan spasi.

Apakah itu bekerja?

Jika Anda mengetik "index.php?q=css.css" di browser, Anda akan melihat satu baris CSS. Jadi semuanya bekerja! Jika Anda membuka kode sumber halaman, Anda akan melihat gambar yang sama. Dengan metode ini, kami mengurangi file CSS 314 karakter menjadi 277 karakter. File HTML dari 528 hingga 448 karakter. Lumayan untuk 15 baris kode.

Kesimpulan

Ini adalah contoh yang bagus tentang bagaimana kita dapat melakukan banyak hal hanya dengan beberapa baris kode. Jika Anda melihat kode sumber situs seperti Google, Anda akan melihat hampir tidak ada baris kosong.

3. Caching skrip PHP.

Saya akan menunjukkan cara mengatur caching skrip Anda menggunakan contoh di atas. Tujuannya adalah untuk mempercepat situs. Intinya sangat sederhana - data tidak akan dihasilkan setiap kali Anda mengakses situs. Mereka akan disimpan dalam cache.

Untuk menambahkan caching, kita perlu menambahkan tiga hal ke skrip kita. Pertama, kita perlu mengumpulkan semua data ke dalam skrip dan membuat file yang unik untuk kumpulan data input ini. Kedua, kita perlu menemukan file cache dan memeriksa seberapa "segar" itu. Ketiga, kita perlu menggunakan salinan cache atau membuat file cache baru untuk digunakan nanti.

Lagi

$direktoriberkas = "";
$berkas = $_GET["q"];
$namaLedakan = meledak(".", $file);
$ext = $namaMeledak;
$namafile = $direktorifile . $berkas;
//-- KAMI MEMILIKI CUKUP DATA UNTUK MENGHASILKAN NAMA FILE CACHE DI SINI --
if ($ext != "css" DAN $ext != "htm" DAN $ext != "html") (
//Memeriksa orang jahat...
die("Peretas...!");
) kalau tidak (

//-- KITA DAPAT MENCEGAH DAN MENGCHECH UNTUK VERSI CACHED DI SINI --

// Mari kita mulai bisnis
$handle = fopen($fileName, "r");
$fileData = fread($handle, filesize($fileName));
// Sekarang untuk beberapa sihir regex!
$databaru = preg_replace("/\s+/", " ", $fileData);

Fclose($pegangan);
// Waktu untuk menampilkan data.

//-- SEKARANG KITA DAPAT MENYIMPAN DATA BARU JIKA DIPERLUKAN DAN MENGELUARKAN DATA --

Jika ($ext == "css") (
header("Tipe konten: teks/css");
}
gema $databaru;
}
?>

$direktoriberkas = "";
$berkas = $_GET["q"];
$namaLedakan = meledak(".", $file);
$ext = $namaMeledak;
$namafile = $direktorifile . $berkas;
$cacheName = "./cache/" . $namaLedakan . $namaLedakan . ".tmp";
if ($ext != "css" DAN $ext != "htm" DAN $ext != "html") (
// Peretas
print_r($ext);
die("Peretas...!");
) kalau tidak (
if (file_exists($cacheName) AND filemtime($cacheName) > (time() - 86400)) (


fclose($cacheHandle);
$isCached = BENAR;
) kalau tidak (
//Awal
$handle = fopen($fileName, "r");
$fileData = fread($handle, filesize($fileName));
// Keajaiban ekspresi reguler
$databaru = preg_replace("/\s+/", " ", $fileData);
fclose($pegangan);
//Cache


fclose($cacheHandle);
$isCached = SALAH;
}
// data keluaran
jika ($ext == "css") (
header("Tipe konten: teks/css");
jika ($isCached) (

}
) kalau tidak (
jika ($isCached) (
gema "";

}
}
gema $databaru;

Penjelasan

Dalam skrip ini, fungsi memperbarui cache setiap 24 jam telah ditambahkan. Ini nyaman. Misalnya, jika Anda mengubah sesuatu di situs, Anda dapat menunggu 24 jam atau menghapus cache.

$cacheName = "./cache/" . $namaLedakan . $namaLedakan . ".tmp";

Sepotong kode ini mengekstrak nama file dan ekstensinya, merekatkannya, dan menambahkannya ke cache dengan ekstensi ".tmp" yang benar.

If (file_exists($cacheName) AND filemtime($cacheName) > (time() - 86400)) (
$cacheHandle = fopen($cacheName, "r");
$newData = fread($cacheHandle, filesize($cacheName));
fclose($cacheHandle);
$isCached = BENAR;
) kalau tidak (

Di sini kami memeriksa cache yang disimpan dan apakah itu dibuat dalam 24 jam terakhir (nilai dalam detik - dapat diubah ke yang lain). Jika kedua syarat tersebut terpenuhi, kita buka file tersebut dan ekstrak isinya untuk mengganti hasil script dengannya. Kami juga menyetel $isCached true untuk mencetak pesan tambahan di bagian akhir.

// Biarkan cache!
$cacheHandle = fopen($cacheName, "w+");
fwrite($cacheHandle, $databaru);
fclose($cacheHandle);
$isCache = SALAH;
}

Kami menyimpan hasil skrip untuk digunakan dalam panggilan lebih lanjut. Kami cukup membuka file dalam mode tulis, membuang informasi di sana dan menutupnya.

// Waktu untuk menampilkan data.
jika ($ext == "css") (
header("Tipe konten: teks/css");
jika ($isCached) (
echo "// Diambil dari file cache.\n";
}
) kalau tidak (
jika ($isCached) (
gema "";
}
}

Bagian skrip ini telah sedikit dimodifikasi sehingga kita dapat melihat hasil pekerjaannya. Jika konten file diambil dari cache, kita dapat menambahkan pesan tentangnya.

Mencoba

Jika kami menggunakan skrip lagi, kami tidak akan melihat perubahan hingga kami menyegarkan halaman. Di bawah ini kita akan melihat tulisan bahwa file tersebut diambil dari cache.

Kesimpulan

Mampu dengan cepat menambahkan caching sederhana ke skrip apa pun berarti Anda berada di jalur yang benar. Skrip dengan caching akan secara signifikan mengurangi beban di server mana pun.

Menyimpulkan

Dalam tutorial ini, saya menunjukkan kepada Anda beberapa cara mudah dan nyaman untuk mempercepat situs Anda menggunakan PHP.

Saat mengembangkan proyek besar, pertanyaan tentang pengoptimalan kode proyek secara bertahap muncul: seberapa dibenarkan konsumsi memori, bagaimana Anda dapat meningkatkan kecepatan eksekusi kode php tertulis. Pada awalnya, banyak yang tidak memikirkan kebenaran dan efisiensi kode tertulis, mereka menulis sesuai dengan prinsip: berfungsi - dan itu bagus. Meskipun penerjemah PHP mengeksekusi kode php cukup cepat, dan ada banyak hambatan yang memperlambat kecepatan eksekusi kode yang berada di luar PHP, pengoptimalan kode php juga penting, dan pengoptimalan kode harus sudah diterapkan di awal pengkodean proses.

Sebagian besar skrip PHP melakukan hal-hal sederhana. Perilaku default skrip adalah memuat sejumlah kecil informasi dari pengguna, mendapatkan beberapa informasi dari database atau file, menampilkan HTML yang sesuai, dan mengirimkan hasilnya ke klien. Di sini, pertama-tama, Anda perlu memahami apa sebenarnya hasil pengoptimalan: kecepatan, kemudahan penskalaan, pengurangan jumlah sumber daya server yang digunakan, pengurangan waktu transfer data, atau semuanya. Dalam kasus terakhir, perlu tidak hanya untuk menemukan semua bagian penting, tetapi juga untuk menyeimbangkan pengoptimalannya.

Izinkan saya memberi Anda contoh paling sederhana, katakanlah di server dengan RAM kosong 100 MB, ada dua skrip, yang hasilnya sama. Skrip pertama dioptimalkan untuk kinerja maksimum, membutuhkan memori 10 MB dan menerima data dari file dengan membacanya sepenuhnya, yang kedua - untuk konsumsi memori minimal, membutuhkan memori 5 MB dan menerima data dari file yang sama di beberapa bagian. Sebagai hasil dari satu permintaan, skrip pertama akan dieksekusi lebih cepat dari yang kedua, tetapi jika ada lebih dari sepuluh permintaan pada saat yang sama, kecepatan skrip kedua akan menjadi lebih cepat. Mengapa ini terjadi? Di skrip pertama, hambatannya adalah penggunaan sumber daya memori, di skrip kedua - fitur sistem I / O. Setelah skrip pertama menghabiskan semua RAM yang tersedia, sistem akan beralih menggunakan memori virtual, sedangkan sistem I / O yang sama akan menjadi hambatan tambahan dari skema ini.

Tentu saja, contoh ini sangat disederhanakan, dan ada hambatan lain selain RAM, tetapi ide utamanya adalah ini: pengoptimalan untuk satu casing dapat menjadi tempat kritis di casing lain. Dalam contoh, sebagai hasil pengoptimalan untuk sedikit peningkatan kecepatan pada beban rendah, kecepatan eksekusi skrip menurun secara signifikan pada beban yang lebih tinggi. Oleh karena itu, untuk mendapatkan pengembalian yang lebih tinggi, penting untuk menghabiskan energi Anda untuk mengoptimalkan area yang benar-benar perlu diperhatikan.

Saya tidak akan mempertimbangkan di sini pengoptimalan sistem operasi, pengoptimalan pengaturan server, dll., karena. sebagian besar webmaster menggunakan hosting dan, karenanya, tidak akan dapat mengatur semuanya sendiri. Hanya pengoptimalan kode php yang akan dipertimbangkan di sini. Perlu dicatat bahwa dalam setiap kasus, beberapa jenis pengoptimalan akan berguna, yang lain akan membuang-buang waktu dan tenaga. Seringkali kegunaan perbaikan kode akan diabaikan. Mungkin seiring waktu, perubahan internal pada PHP akan membuat pengoptimalan yang berhasil menjadi tidak berguna atau bahkan berbahaya.

Berikut ini adalah peningkatan kinerja utama untuk PHP 5:

Langkah-langkah untuk mengoptimalkan konsumsi RAM:

  1. Analisis hasil fungsi Anda. Sebelum menulis suatu fungsi, periksa apakah ada padanan standarnya.
  2. Membebaskan memori jika penggunaan array atau objek besar berakhir hanya dalam lingkup global (memori akan dibebaskan secara otomatis dalam lingkup lokal). Harap dicatat bahwa fungsi batalkan() menghapus variabel dari ruang lingkup dan, hanya jika tidak ada referensi lain ke objek, lepaskan memori yang ditempati oleh objek tersebut. Menetapkan nilai ke variabel batal selalu menghancurkan objek dan membebaskan memori yang ditempati oleh objek tersebut, terlepas dari apakah masih ada referensi ke objek ini. Dalam hal ini, variabel tidak akan dihapus dari ruang lingkup, mis. sebenarnya, variabel akan berisi nilai (nol) yang tidak ditentukan dan, karenanya, akan menempati memori untuk konten variabel ini (sekitar 72 byte).
  3. Analisis pembenaran untuk menggunakan OOP (pemrograman berorientasi objek). Sebelum menulis kode berorientasi objek, tanyakan pada diri Anda dua pertanyaan: "apakah pendekatan berorientasi objek diperlukan di sini?" dan "dapatkah saya menulis kode berorientasi objek?". Misalnya, mendefinisikan fungsi statis di dalam kelas akan meningkatkan jumlah memori yang diperlukan hanya untuk memuat fungsi tersebut sebesar 10-18%. Menggunakan array sebagai struktur daripada kelas juga menghemat memori. Mungkin lebih bermanfaat untuk hanya meletakkan fungsi dalam file terpisah, daripada mengimplementasikannya sebagai metode kelas.
  4. Analisis kemungkinan menerapkan versi statis dari metode di kelas. Jika metode tidak menggunakan parameter $ini, maka harus dideklarasikan menggunakan kata kunci statis.

Tindakan untuk meningkatkan kecepatan eksekusi kode:

  1. Analisis optimalisasi kueri SQL. Di sebagian besar proyek, pengoptimalan kueri SQLlah yang memberikan peningkatan kinerja terbesar.
  2. Penggunaan buffering keluaran, berbagai modul caching, memungkinkan Anda meningkatkan kinerja hingga 25% -100%.
  3. Menggunakan nama pendek yang lebih pendek untuk variabel, fungsi, konstanta, dan kelas dapat meningkatkan performa hingga 20%. Pada saat yang sama, jangan lupakan dukungan kode lebih lanjut, nama fungsi yang cukup jelas jauh lebih nyaman saat memodifikasi kode.
  4. Memeriksa keberadaan variabel (function isset()) sebelum menghubunginya. Menekan kesalahan yang terjadi saat mengakses variabel yang tidak ada dengan menggunakan @ sangat mengurangi kinerja.
  5. Menggunakan "tanda kutip tunggal" memungkinkan Anda menginterpretasikan kode lebih cepat, karena dalam kasus "tanda kutip ganda", variabel dicari di dalam string
  6. Analisis kemungkinan menghapus fungsi "ekstra" dari siklus. Misalnya, mengganti fungsi menghitung() ke variabel yang dihitung sebelum dimulainya perulangan dan berisi hasil dari fungsi ini, dalam ekspresi untuk($i=0; $i akan meningkatkan kinerja siklus ini. Jika tidak, fungsinya menghitung() akan dipanggil dan dieksekusi pada setiap iterasi loop.
  7. Penggunaan operator kasus alih-alih beberapa penggunaan konstruk jika... lain.
  8. Menggunakan akses eksplisit ke bidang array. Lihat pembalikan $array["id"] berjalan 7 kali lebih cepat daripada pembalik $array. Selain itu, ini melindungi dari kesalahan selama pemeliharaan skrip lebih lanjut, karena. suatu hari mungkin ada konstanta bernama pengenal.
  9. Menggunakan variabel tambahan yang berisi referensi ke larik akhir saat memproses larik multidimensi dalam satu lingkaran. Untuk mempercepat siklus untuk($i = 0; $i< 5; $i++) $a["b"]["c"][$i] = func($i); , sebelum dimulainya perulangan dimungkinkan untuk menulis instruksi berikut $item =p$a["b"]["c"] dan tulis ulang loop seperti ini: untuk($i = 0; $i< 5; $i++) $ref[$i] = $i; .
  10. Menggunakan modul Apache mod_gzip dan mod_deflate memungkinkan Anda mengurangi lalu lintas, sehingga meningkatkan kecepatan memuat halaman.

Langkah pengoptimalan kode berikut meningkatkan kinerja hanya saat digunakan kembali:

  1. Penggunaan ++$i alih-alih $i++ dalam siklus memberikan peningkatan kinerja sebesar 6%.
  2. Menggunakan "tanda kutip ganda" untuk menggabungkan (merekatkan) variabel. Lihat instruksi $s="$s1$s2$s3" ditafsirkan lebih cepat dari $s=$s1.$s2.$s3. Pernyataan ini benar hanya untuk tiga variabel atau lebih.
  3. Menggunakan Jalur Lengkap dalam Instruksi termasuk Dan memerlukan akan memungkinkan Anda menghabiskan lebih sedikit waktu untuk mencari jalur nyata oleh sistem.
  4. Menutup koneksi database terbuka saat tidak lagi diperlukan. Pada saat yang sama, Anda tidak boleh terhubung ke database yang sama berkali-kali.
  5. Analisis kelayakan penggantian termasuk() Dan sertakan_sekali() pada memerlukan() Dan membutuhkan_sekali() masing-masing.
  6. Menggunakan sisipan HTML dalam kode, alih-alih mengeluarkan sejumlah besar baris statis (tidak berisi hasil kode). Secara umum, kecepatan penerbitan halaman statis (HTML) beberapa kali lebih cepat daripada penerbitan halaman yang ditulis dalam PHP. Tapi di sini Anda tidak boleh terbawa suasana, karena. input ke juru bahasa dalam mode pemrosesan PHP dan output darinya juga memuat server.
  7. Analisis kemungkinan penggantian fungsi preg_replace Dan str_replace dalam beberapa kasus. Fungsi str_replace bekerja lebih cepat dari preg_replace, dan pada saat yang sama fungsinya strtr fungsi lebih cepat str_replace. Juga, menggunakan fungsi string strncasecmp, strpbrk Dan garis-garis lebih optimal daripada menggunakan ekspresi reguler. Namun, alih-alih menyarangkan fungsi-fungsi ini, Anda harus menggunakan fungsi ekspresi reguler.
  8. Menggunakan inisialisasi variabel eksplisit. Misalnya, menaikkan variabel yang tidak diinisialisasi adalah 9-10 kali lebih lambat daripada variabel yang diinisialisasi sebelumnya. Selain itu, ada lebih sedikit kesalahan saat menginisialisasi variabel secara eksplisit.
  9. Sebagai kesimpulan, saya ingin mencatat bahwa penggunaan konstruksi gema, alih-alih fungsi mencetak, tidak memberikan peningkatan kinerja yang nyata.
  • Untuk menentukan waktu mulai eksekusi skrip, lebih baik menggunakan fungsi yang mengembalikan waktu saat ini $_SERVER["REQUEST_TIME"].
  • Gunakan profiler untuk mengidentifikasi bagian penting dari kode.

Sebelum mengoptimalkan kinerja kode, saya sangat menyarankan untuk memeriksa pengoptimalan kueri SQL ke database, serta mengoptimalkan kueri http, mengurangi ukuran js dan css, memikirkan tentang caching template, dan baru setelah itu mulailah memeriksa kode untuk pertunjukan.

Gaya pemrograman yang baik adalah tentang pengoptimalan saat menulis kode, bukan menambal lubang nanti.

Mempelajari seluruh httpd.conf, menggali banyak panduan tentang beban tinggi (mereka sudah tua dan dengan saran yang meragukan seperti "nonaktifkan modul yang tidak perlu"
Salah satu modul pertama yang harus dinonaktifkan dari Apache, untuk kecepatan, adalah dukungan untuk file .htaccess, dukungan kinerja ini sendiri tidak ditambahkan, dan terlebih lagi keberadaan file-file ini.
1) Apakah yang disebut prosesor "kuat" lebih lambat untuk semua VPS daripada beberapa hosting yang menyedihkan, meskipun dengan tarif VIP?
Tidak, mungkin Anda, secara pribadi, memiliki semacam penghosting VPS yang jelek, atau lebih buruk lagi, tarif seperti "OpenVZ, kami tidak menjual kembali sumber daya yang terjual... yah, mungkin 10 kali, tetapi kami tidak menjual kembali lagi"
2) Akankah FastCGI membantu dalam situasi ini?
FastCGI adalah mode operasi PHP, itu tidak secara langsung mempengaruhi kinerja sebagian besar, apalagi logika operasi FCGI itu sendiri (jika kita membandingkan Apache-FCGI dan Apache-mod_php) akan lebih lambat, karena soket akan digunakan untuk Interaksi FastCGI (" soket normal" atau unix), yang menyiratkan komunikasi jaringan, alih-alih operasi langsung dari juru bahasa PHP "di dalam" server. Saya pikir sedikit hal lain akan membantu Anda (saya akan mencoba menjelaskan di bawah).
3) Mengapa chip seperti eAccelerator (caching AST, dll.) tidak populer?
Saya tidak tahu mengapa mereka tidak populer dan dari mana Anda mendapatkan statistik seperti itu ... Tapi, mungkin, faktanya eAccelerator sudah ketinggalan zaman secara moral dan fisik, dan jika Anda percaya, misalnya, artikel dangkal seperti itu (tidak, saya tidak bekerja dengan CMS " mahakarya" seperti "Bitrix", itu hanya penyebutan pertama eAccelerator yang muncul di benak saya) - ini tidak berfungsi dengan versi PHP yang lebih tinggi dari 5.3.
Saya tahu banyak dari mereka yang ditinggalkan, tapi ini bukan sebab, tapi akibat.
Saya tidak dapat mengomentari ini, karena Anda tidak menunjukkan konsekuensinya - apa tepatnya. Dengan kata lain, saya tidak begitu mengerti apa yang Anda maksud dengan itu.
4) Apa lagi yang bisa membantu?
Nah, langsung saja, dari memori (opsi mungkin tidak terkait):
1. Menghapus dukungan .htaccess di Apache, atau setidaknya mengurangi jumlahnya
2. Menginstal Nginx sebagai server front-end untuk melayani statis
3. Pengabaian total Apache secara umum dan transisi ke Nginx + FCGI (jangan berpikir, saya sangat menyukai Apache karena fleksibilitasnya dalam konfigurasi dan kemungkinan yang luas, pertanyaan lainnya adalah hanya sedikit orang yang benar-benar membutuhkan fleksibilitas ini dan hanya sedikit orang yang dapat melakukannya kompeten, efisien, dan sepenuhnya mengkonfigurasi ... Nginx dalam hal ini akan jauh lebih sederhana). Mengapa FCGI? Karena fakta bahwa saya tidak tahu cara lain yang dapat diterima untuk berinteraksi dengan Nginx dengan PHP, diperlukan penyiapan kumpulan FCGI.
4. OpCache - dari versi 5.5 "percikan" sudah terpasang, untuk mengaktifkan dan mengonfigurasi - sangat disarankan. Saya tidak tahu bagaimana dengan CMS dan apakah Anda menggunakan CMS di situs, tetapi dari pengalaman saya, kecepatan kerangka kerja PHP meningkat rata-rata 8-20 kali lipat.
5. HHVM sebagai alternatif
6. Periksa:
a) Fakta bahwa masalahnya benar-benar ada di PHP. Secara khusus, ada baiknya mengumpulkan semua log server, misalnya, berapa lama permintaan berlangsung, di database, jumlahnya, dan sebagainya.
b) Memeriksa kecepatan subsistem disk ... Saya tidak akan "menyodok satu jari", tetapi pada suatu waktu saya menyewa VPS dalam jumlah yang cukup besar "ok dari satu penghosting populer, dan pada titik tertentu, saya perhatikan bahwa rata-rata kecepatan subsistem disk - 1,4Kb / detik, sementara "kegagalan" (alias "tidak mungkin menulis blok") sekitar 50% kasus ... itu tidak berlangsung lama, tetapi setelah beberapa bulan, hal yang sama hoster memiliki tarif dengan " HDD biasa", untuk beberapa alasan mereka memiliki subsistem disk yang lebih cepat daripada tarif dengan "SSD cepat"... kita dapat menarik kesimpulan...
c) Periksa kecepatan prosesor yang sebenarnya, tidak jarang sangat berbeda dari yang layu.

P.S. Jika Anda merumuskan pertanyaan dengan lebih tepat, saya dapat memberikan rekomendasi yang lebih tepat, kecuali tentu saja Anda membutuhkannya :)

P.P.S. Ada varian pemecahan masalah secara umum "di dahi", mungkin yang paling rumit dan mungkin paling produktif dalam beberapa kasus. Ini adalah Varnish + menyempurnakannya, memungkinkan Anda untuk mengeluarkan sebagian besar halaman dari cache (RAM) dalam nanodetik, terkadang memungkinkan Anda untuk melayani ribuan permintaan per menit, sementara ini bukan hanya caching kode atau semacamnya seperti itu ... ini adalah caching seluruh halaman dan/atau respons server. Antara lain - memungkinkan Anda untuk "tidak menyentuh backend sama sekali", mis. saat meminta halaman, mungkin tidak ada panggilan basis data, tidak ada eksekusi kode PHP yang sama (atau lainnya) di sisi server. Membutuhkan penyetelan yang agak halus, tidak terlalu cocok untuk situs "di CMS", untuk situs di kerangka kerja - ini memerlukan pendekatan pengembangan yang benar pada awalnya dan memikirkan apa dan bagaimana akan / harus di-cache. Dengan pendekatan yang salah - hasil yang paling mungkin - ini akan berhasil, tetapi tidak secepat yang kita inginkan, dan sebagian situs mungkin berhenti berfungsi secara normal. Ada juga solusi lain, tetapi mengingat kata-kata yang agak umum dari pertanyaan tersebut, agak sulit untuk membicarakannya.

Oh ya, saya lupa detail penting... Mengapa "host" menggunakan Apache dan tidak meninggalkannya (sepenuhnya)? Lebih jauh lagi, karena Apache memungkinkan Anda untuk mendelegasikan sebagian pengaturan kepada pengguna melalui .htaccess. Pada saat yang sama, untuk statika, Nginx yang sama seringkali sepadan, yang, seperti yang Anda pahami, tidak mengizinkan pengguna mendelegasikan sebagian pengaturan dengan cara ini, yang berarti tidak cocok untuk tugas-tugas ini dan tidak "tergelincir" pada ini (tidak seperti Apache "dan ) Termasuk dan karena alasan ini, kami 99% meninggalkan "hosting" (karena kehadiran Apache, dan ketidakmampuan untuk menghapusnya atau mengonfigurasinya sendiri, dan sebagai akibat dari "rem" yang menyertai pendekatan ini).