Optimize php application in high traffic environment

969 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
969
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
48
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Optimize php application in high traffic environment

  1. 1. Optimize PHP Application in High Traffic Environment Oleh Iskandar Soesman http://kandar.info @k4ndar
  2. 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
  3. 3. The Code
  4. 4. Upgrade ke Versi PHP Terbaru dan Stabil ● PHP Core Developer selalu berusaha untuk meningatkan performa dan memperbaiki setiap bug.
  5. 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.
  6. 6. 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
  7. 7. Gunakan Variable Secukupnya $description = strip_tags($_POST['description']); echo $description; echo strip_tags($_POST['description']);
  8. 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. 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. 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. 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. 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. 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. 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.
  15. 15. The Server And Infrastructure
  16. 16. PHP Engine Install hanya modul yang diperlukan.
  17. 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. 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. 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. 20. Tuning Web Server ● Gunakan modul yang hanya diperlukan ● Gunakan konfigurasi variable yang sesuai dengan kebutuhan
  21. 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.
  22. 22. 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
  23. 23. Gunakan Variable Secukupnya $description = strip_tags($_POST['description']); echo $description; echo strip_tags($_POST['description']);
  24. 24. Hindari Penggunaan setters dan getters yang Tidak Perlu

×