Upload
k4ndar
View
753
Download
0
Embed Size (px)
Citation preview
Optimize PHP Application in High Traffic Environment
OlehIskandar Soesmanhttp://kandar.info
@k4ndar
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
Upgrade ke Versi PHP Terbaru dan Stabil
● PHP Core Developer selalu berusaha untuk meningatkan performa dan memperbaiki setiap bug.
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.
Profiling Tools
● xdebug http://xdebug.org/● xhprof
http://php.net/manual/en/book.xhprof.php● zend debugger ?● PHP Profiler
https://github.com/steves/PHP-Profiler● PHP FPM
Gunakan Variable Secukupnya
$description = strip_tags($_POST['description']);echo $description;
echo strip_tags($_POST['description']);
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.
Runtime CacheCache 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.
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);}
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")...
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.
Gunakan Asynchronous Sebisa Mungkin
Proses Asynchronous memungkin dalam menjalankan suatu proses tidak perlu harus
menunggu proses tersebut selesai (non blocking).
pg_send_query();
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.
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
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
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
Tuning Web Server
● Gunakan modul yang hanya diperlukan● Gunakan konfigurasi variable yang sesuai
dengan kebutuhan
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.
Profiling Tools
● xdebug http://xdebug.org/● xhprof
http://php.net/manual/en/book.xhprof.php● zend debugger ?● PHP Profiler
https://github.com/steves/PHP-Profiler● PHP FPM
Gunakan Variable Secukupnya
$description = strip_tags($_POST['description']);echo $description;
echo strip_tags($_POST['description']);