24
Optimize PHP Application in High Traffic Environment Oleh Iskandar Soesman http://kandar.info @k4ndar

Optimize php application in high traffic environment

  • 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

The Code

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.

The Server And Infrastructure

PHP Engine

Install hanya modul yang diperlukan.

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']);

Hindari Penggunaan setters dan getters yang Tidak Perlu