Dokumen tersebut memberikan rekomendasi untuk mengoptimalkan kinerja aplikasi PHP di lingkungan dengan lalu lintas tinggi, termasuk memperbarui PHP ke versi terbaru, melakukan profiling, mengurangi query ke database, menggunakan cache, dan mengkonfigurasi server secara tepat.
Optimize php application in high traffic environment
1. Optimize PHP Application in High Traffic
Environment
Oleh
Iskandar Soesman
http://kandar.info
@k4ndar
2. Introduction
● Hal yang sama bisa diimplementasikan secara
general
● Mengembangkan suatu aplikasi harus bisa
berfikir dari sudut pandang tidak hanya
sebagai developer, tetapi juga sysadmin dan
DBA
4. Upgrade ke Versi PHP Terbaru dan
Stabil
● PHP Core Developer selalu berusaha untuk
meningatkan performa dan memperbaiki
setiap bug.
5. Lakukan Profiling
● Profiling memberikan gambaran yang lebih
jelas pada bagian-bagian mana yang
menjadikan bottleneck pada aplikasi.
● Profiling juga memberikan berapa lama waktu
eksekusi aplikasi.
● Tentukan berapa nilai yang menjadi acuan
waktu eksekusi dalam 1 kali runtime.
8. Hindari Penggunaan setters dan
getters yang Tidak Perlu
class User {
public $name = '';
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$user = new User();
$user->setName('Arman');
echo $user->getName();
$user = new User();
$user->name = 'Arman';
echo $user->name;
Men-set nilai ke dalam property selain menghemat penggunaan memory, cara
ini juga mepercepat waktu development.
9. Runtime Cache
Cache return value suatu method/fungsi yang digunakan berulang kali dalam satu kali
runtime.
$runCahe = array();
function getUserInfo($userId)
{
global $runCahe;
if( isset($runCahe[$userId]) )
return $runCahe[$userId];
$runCahe[$userId] = queryDB("select name, email from user WHERE id = $userId");
return $runCahe[$userId];
}
Cara ini juga untuk mengurangi query yang sama dilakukan berulang kali ke data
resource seperti DB, Cache Server dll.
10. Hindari Query di dalam Loop
Query yang berulang mengakibatkan request yang berulang ke database
foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
mysql_query($query);
}
11. Gunakan Bulk Query jika tersedia
$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
Proses di atas akan menghasilkan:
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...
12. Hindari Active Record
● Active Record mempersempit ruang gerak
developer dan DBA untuk melakukan optimasi
query.
● Menghindari penggunaan Active Record
berarti mengurangi penggunaan memory web
server dalam men-konstruct query yang
dilakukan pada class Active Record.
13. Gunakan Asynchronous Sebisa
Mungkin
Proses Asynchronous memungkin dalam
menjalankan suatu proses tidak perlu harus
menunggu proses tersebut selesai (non
blocking).
pg_send_query();
14. Load External Resouce Via
Javascript
Pada saat runtime dan aplikasi membutuhkan
data dari resoursce external seperti API, kita
tidak pernah mendapat jaminan resource
tersebut memberikan response yang cepat.
Jika hal ini terjadi, setidaknya tidak membuat
runtime aplikasi kita blocking.
17. Opcode Cache
●
Output dari code akan disimpan menjadi bytecode compiler dan disimpan ke
dalam shared memory.
● Optimasi bytecode ini memungkinkan untuk mendapatkan exsekusi runtime
yang lebih cepat karena instruksi proses pada low level menjadi lebih efisien.
● APC
● Zend Opcache
18. Cache Object Server
● Simpan setiap object data yang didapat dari query ke DB ke dalam Cache Object Server.
Ini kana mempercepat proses pengambilan data yang dibutuhkan secara berulang.
● Query pada Cache Server menggunakan key-value yang datanya disimpan di dalam
memory, sehingga proses pengambilan data menjadi lebih cepat.
● Redis
● Memcache
19. Gunakan search Tools dari pada
search ke DB
● Walaupun beberpa database tools telah
menyediakan feature full text search, akan lebih
efisien jika proses ini dilakukan pada tools yang
memang dibuat untuk melakukan pencarian.
● Solr
● Elasticsearch
20. Tuning Web Server
● Gunakan modul yang hanya diperlukan
● Gunakan konfigurasi variable yang sesuai
dengan kebutuhan
21. Lakukan Profiling
● Profiling memberikan gambaran yang lebih
jelas pada bagian-bagian mana yang
menjadikan bottleneck pada aplikasi.
● Profiling juga memberikan berapa lama waktu
eksekusi aplikasi.
● Tentukan berapa nilai yang menjadi acuan
waktu eksekusi dalam 1 kali runtime.