optimasi php

28
Mari kita lihat apa adalah beberapa cara untuk mengoptimalkan kode untuk membantu pekerjaan kami dengan lebih untuk melakukannya. Lebih atau kurang di offline. Hal ini masih lebih baik daripada tidak melakukan apa-apa Ya, saya offline. 1. Jika metode bisa menjadi statis, menyatakan itu statis. Kecepatan adalah perbaikan dengan faktor 4. "Jika metode statis yang dapat dilakukan, hal itu harus dilakukan karena akan membuat sekitar 4 kali lebih cepat." 2. echo lebih cepat daripada cetak. "Echo lebih cepat dari cetak.". 3. Gunakan beberapa parameter echo bukannya penggabungan string. "Echo beberapa variabel. Lebih baik datang bersama sebagai variabel. " Lakukan: echo 'Dengan echo Anda dapat', 'gunakan koma', 'untuk parameter output ganda.'; Jangan: echo 'Dengan echo Anda dapat' 'Gunakan koma'.. 'Untuk parameter output ganda.'; 4. Mengatur MaxValue untuk untuk anda-loops sebelum dan tidak dalam loop. ถถถถถถ for loop ถถถถถถถถถถถถถถถถถถถถถถถถถถถ” Lakukan: for ($ i = 0, $ max_loop = sizeof ($ array_a); $ i <$ max_loop; $ i + +). Jangan: for ($ i = 0; $ i <sizeof ($ array_a); $ i + +). 5. Unset variabel Anda untuk membebaskan memori, terutama array besar. "Variabel yang tidak diset, terutama array besar." 6. Hindari sihir seperti __get, __set, __autoload. "Hindari menggunakan __get, __set, __autoload". 7. require_once () adalah mahal. "Hindari penggunaan require_once bukan menulis kode sebagai berikut. Lakukan: class_exists ('KelasSaya') | | membutuhkan ('path / ke /

Upload: irvan-ci

Post on 02-Jul-2015

295 views

Category:

Documents


25 download

TRANSCRIPT

Page 1: Optimasi Php

Mari kita lihat apa adalah beberapa cara untuk mengoptimalkan kode untuk membantu pekerjaan kami dengan lebih untuk melakukannya. Lebih atau kurang di offline. Hal ini masih lebih baik daripada tidak melakukan apa-apa Ya, saya offline.

1. Jika metode bisa menjadi statis, menyatakan itu statis. Kecepatan adalah perbaikan dengan faktor 4."Jika metode statis yang dapat dilakukan, hal itu harus dilakukan karena akan membuat sekitar 4 kali lebih cepat."2. echo lebih cepat daripada cetak."Echo lebih cepat dari cetak.".3. Gunakan beberapa parameter echo bukannya penggabungan string."Echo beberapa variabel. Lebih baik datang bersama sebagai variabel. "

Lakukan: echo 'Dengan echo Anda dapat', 'gunakan koma', 'untuk parameter output ganda.';

Jangan: echo 'Dengan echo Anda dapat' 'Gunakan koma'.. 'Untuk parameter output ganda.';

4. Mengatur MaxValue untuk untuk anda-loops sebelum dan tidak dalam loop.“ถ้�าใช้� for loop ให้�ตั้�งค่�าสู�งสู�ดก่�อนจะวนลู�ป”

Lakukan: for ($ i = 0, $ max_loop = sizeof ($ array_a); $ i <$ max_loop; $ i + +).Jangan: for ($ i = 0; $ i <sizeof ($ array_a); $ i + +).

5. Unset variabel Anda untuk membebaskan memori, terutama array besar."Variabel yang tidak diset, terutama array besar."6. Hindari sihir seperti __get, __set, __autoload."Hindari menggunakan __get, __set, __autoload".7. require_once () adalah mahal."Hindari penggunaan require_once bukan menulis kode sebagai berikut.

Lakukan: class_exists ('KelasSaya') | | membutuhkan ('path / ke / myClass.class.php');Jangan: require_once ('path / ke / myClass.class.php');

8. Gunakan jalur penuh meliputi dan membutuhkan, sedikit waktu yang dihabiskan untuk menyelesaikan jalur OS."Gunakan path lengkap dalam menyertakan dan memerlukan lebih cepat daripada jalur input relatif".Lakukan: require ('path / ke / myClass.class.php');Jangan: memerlukan myClass.class.php ('../ ');

9. Jika Anda perlu mencari tahu waktu ketika script mulai dijalankan, ['REQUEST_TIME'] $ _SERVER lebih disukai ke waktu ()."Jika Anda dapat menemukan waktu untuk menjalankan script untuk menggunakan $ ['REQUEST_TIME'] _SERVER bukan waktu ()".

Page 2: Optimasi Php

10. Lihat apakah anda dapat menggunakan strncasecmp, strpbrk dan stripos bukan regex."Hindari menggunakan regex giliran untuk strncasecmp, strpbrk dan stripos sebagai gantinya."

11. str_replace lebih cepat daripada preg_replace, tetapi strtr lebih cepat daripada str_replace dengan faktor 4."Str_replace lebih cepat dari preg_replace, tetapi strtr lebih cepat daripada str_replace sekitar 4 kali."

12. Jika fungsi, seperti fungsi string pengganti, menerima baik array dan single karakter sebagai argumen, dan jika daftar argumen anda tidak terlalu lama, pertimbangkan untuk menulis laporan pengganti beberapa berlebihan, melewati satu karakter pada satu waktu, bukannya satu baris kode. yang menerima array sebagai argumen mencari dan mengganti.

13. Lebih baik menggunakan pernyataan memilih dari multi if, else if, pernyataan."Kasus ini bukan beberapa lapisan jika lain".Lakukan: switch ($ param) {.Kasus 1: echo "1"; break;kasus 2: echo "2"; break;kasus 3: echo "3"; break;default: echo "none";}.Jangan: if ($ param == 1) {.echo "1";} Else if ($ param == 2) {.echo "2";} Else if ($ param == 3) {.echo "3";} Else {.echo "none";}.14. Error penindasan dengan @ sangat lambat."Hindari memakai fungsi @ Home untuk menangkap kesalahan karena berjalan sangat lambat."Lakukan: fopen ("path file");Jangan: @ fopen ("path file");15. Hidupkan mod_deflate apache's."Pada penggunaan apache mod_deflate".16. Tutup koneksi database Anda ketika Anda sudah selesai dengan mereka."Tutup koneksi ke database selalu dimatikan."17. $ ['Id'] Row adalah 7 kali lebih cepat dari $ row [id]."$ ['Id'] Row lebih cepat dari $ row [id] sekitar tujuh kali."18. Pesan kesalahan yang mahal."Pesan error yang menandakan bahwa ia lambat. Harus dihindari. "

Page 3: Optimasi Php

19. Jangan menggunakan fungsi dalam for loop, seperti untuk ($ 0 = x; $ x <count ($ array); $ x) Hitungan () fungsi dipanggil setiap kali."Jangan gunakan fungsi in untuk loop".

Lakukan: for ($ i = 0, $ max_loop = count ($ array_a); $ i <$ max_loop; $ i + +).Jangan: for ($ i = 0; $ i <count ($ array_a); $ i + +).

20. Meningkatkan sebuah variabel lokal dalam sebuah metode yang paling cepat. Hampir sama seperti memanggil variabel lokal dalam suatu fungsi."Penambahan variabel lokal variabel dalam metode lebih cepat dekat Variabel lokal dalam sebuah fungsi variabel ".

21. Meningkatkan sebuah variabel global adalah 2 kali lambat dari var lokal.“ค่วรห้ลู�ก่เลู��ยงก่ารใช้� global variable เพราะทำ างานช้�าก่ว�า local variable ประมาณ 2 เทำ�า”

22. Incrementing properti objek (misalnya $ this-> prop + +) adalah 3 kali lebih lambat dari sebuah variabel lokal."Hindari menggunakan properti objek nilai tambah karena lebih lambat dari sekitar 3 kali variabel lokal."

23. Incrementing sebuah variabel lokal yang tidak terdefinisi 9-10 kali lebih lambat dari satu pra-diinisialisasi."Tambahkan sebuah variabel yang tidak dideklarasikan. Lebih lambat dari mencatat sekitar 9-10 kali. "Lakukan: $ i = 0; $ i + +;Jangan: $ i + +;

24. Hanya mendeklarasikan variabel global tanpa menggunakannya dalam fungsi juga memperlambat segalanya (oleh tentang jumlah yang sama seperti meningkatkan sebuah var lokal). PHP mungkin melakukan periksa untuk melihat apakah ada global."Seperti variabel lokal untuk variabel Gobal jika tidak dideklarasikan. Aku menggunakannya lagi, juga. "

25. Metode doa tampaknya independen dari sejumlah metode yang didefinisikan di kelas karena saya menambahkan 10 metode yang lebih ke kelas tes (sebelum dan setelah metode test) dengan tidak ada perubahan dalam kinerja."Jumlah metode di kelas tidak mempengaruhi kinerja".

26. Metode dalam kelas-kelas turunan berjalan lebih cepat dari yang didefinisikan di kelas dasar."Metode kerja bola lebih cepat dibandingkan dengan metode kelas di kelas orang tua."

27. Panggilan fungsi dengan satu parameter dan fungsi tubuh kosong memakan waktu sekitar waktu yang sama seperti melakukan 7-8 $ localvar + + operasi. Pemanggilan metode yang sama ini tentu saja sekitar 15 $ localvar + + operasi.

Page 4: Optimasi Php

"Menjalankan fungsi dari variabel, tetapi tidak seorangpun berbuat sesuatu untuk menambahkan lebih dari sekitar 7-8 kali variabel lokal."

28. String Sekitarnya Anda dengan 'bukan "akan membuat hal-hal menafsirkan sedikit lebih cepat karena tampak php untuk variabel di dalam" ... "tapi tidak di dalam' ... '. Tentu saja Anda hanya dapat melakukan hal ini ketika Anda tidak perlu memiliki variabel dalam string."Tutup dengan string 'bukan" menjalankan sedikit lebih cepat, tetapi untuk menempatkan variabel string harus digunakan "...".

1 Lakukan: $ string 'nilai' =; echo $ string;Jangan: $ string = "nilai"; echo $ string;

2 Lakukan: $ string 'nilai'; $ string2 = "ini adalah $ string"; echo $ string2;Jangan: $ string = 'nilai'; $ string2 = 'ini adalah $ string'; echo $ string2;

29. Ketika bergema string itu lebih cepat untuk memisahkan mereka dengan koma, bukan titik. Catatan: Ini hanya bekerja dengan echo, yang merupakan fungsi yang dapat mengambil beberapa string sebagai argumen."Ulangi dengan Pasal 3."

30. Sebuah script PHP akan dilayani setidaknya 2-10 kali lebih lambat dari halaman HTML statis oleh Apache. Cobalah untuk menggunakan lebih halaman statis HTML dan skrip lebih sedikit."Php menjalankan sekitar 2-10 kali lebih lambat dari HTML."

31. Anda skrip PHP dikompilasi ulang setiap kali kecuali skrip cache. Pasang produk caching PHP ke biasanya meningkatkan kinerja dengan 25-100% dengan membuang waktu kompilasi."Php akan mengkompilasi setiap kali Anda menggunakan cache, kecuali bahwa hal tersebut akan membantu untuk gambar Dai cache komposit sekitar 25-100% lebih baik."

32. Cache sebanyak mungkin. Gunakan memcached - memcached adalah memori kinerja tinggi objek sistem caching dimaksudkan untuk mempercepat aplikasi web dinamis dengan mengurangi beban database. cache kode OP berguna sehingga script anda tidak harus dikompilasi pada setiap request."Untuk melakukan sebagai cache sebanyak mungkin, merekomendasikan penggunaan memcached untuk objek cache dan cache OP kode untuk script PHP".

33. When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick.

Page 5: Optimasi Php

"Isset lebih cepat dari strlen".

Lakukan: if (isset ($ foo {5})!) {Echo "Foo terlalu singkat";}.Jangan: if (strlen ($ foo) <5) {echo "Foo terlalu singkat";}.

34. Ketika incrementing atau decrementing nilai variabel $ i + + terjadi menjadi anak laki-laki lebih lambat kemudian + + $ i. Ini adalah sesuatu PHP yang spesifik dan tidak berlaku untuk bahasa lain, jadi jangan pergi memodifikasi Anda C atau kode Java berpikir tiba-tiba akan menjadi lebih cepat, tidak akan. + + $ Saya terjadi lebih cepat di PHP karena bukan 4 opkode digunakan untuk $ i + + Anda hanya perlu 3. Post incrementation sebenarnya menyebabkan dalam penciptaan sebuah var sementara yang kemudian bertambah. Sementara meningkatkan pra-incrementation nilai asli secara langsung. Ini adalah salah satu optimasi yang opcode dioptimalkan seperti pengoptimasi Zend PHP. Ini adalah ide yang baik masih perlu diingat karena tidak semua pengoptimalan opcode melakukan optimasi ini dan ada banyak ISP dan server yang berjalan tanpa pengoptimasi opcode."+ + $ I; Lebih cepat daripada $ i + +; ".

35. Tidak semuanya harus OOP, sering terlalu overhead banyak, setiap panggilan metode dan objek mengkonsumsi banyak memori."Jangan menulis apa-apa karena overhead OOP dalam hal memori".

36. Jangan mengimplementasikan setiap struktur data sebagai sebuah kelas, array berguna juga."Jangan membuat array data harus diganti dengan kelas."

37. Jangan terlalu banyak metode split, berpikir, dimana kode Anda benar-benar akan digunakan kembali."Jangan mencoba untuk menciptakan banyak metode untuk membedakan spesifik untuk menggunakan kembali".38. Anda selalu dapat membagi kode metode kemudian, ketika diperlukan.39. Memanfaatkan fungsi yang telah ditetapkan tak terhitung jumlahnya.

40. Jika Anda memiliki fungsi sangat memakan waktu dalam kode Anda, pertimbangkan untuk menulis mereka sebagai perpanjangan C."Jika ada lebih dari cukup waktu untuk menulis fungsi ekstensi C".

41. Profil kode Anda. profiler A menunjukkan Anda, bagian mana dari kode Anda memakan waktu berapa banyak. Para debugger Xdebug sudah berisi profiler sebuah. Profiling menunjukkan hambatan dalam tinjauan.

42. mod_gzip yang tersedia sebagai modul Apache kompres data Anda on the fly dan dapat mengurangi data untuk transfer hingga 80%."Mod_gzip memungkinkan Apache untuk mengurangi ukuran data hingga 80%."

Page 6: Optimasi Php

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Optimasi dan Performansi Aplikasi Web PHP

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Com

Didik Dwi [email protected]://groups.yahoo.com/group/didik_directoryLisensi Dokumen:Copyright © 2003-2006 IlmuKomputer.ComSeluruh dokumen di IlmuKomputer.Com dapat digunakan, dimodifikasi dandisebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarattidak menghapus atau merubah atribut penulis dan pernyataan copyright yangdisertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang,kecuali mendapatkan ijin terlebih dahulu dari IlmuKomputer.Com.Setiap orang pasti mendambakan aplikasi yang memiliki performansi tinggi, baik itu Anda selakupemrogram, ataupun user yang nantinya akan menggunakan program. Terlepas dari faktor spesifikasiperangkat keras, desain, algoritma, dan penulisan kode program juga sangat mempengaruhi hasilaplikasi, khususnya terkait dengan masalah performansi atau unjuk kerja.Optimasi sendiri merupakan suatu proses fine-tuning program dalam upaya untuk meningkatkankecepatan akses dan mengurangi penggunaan memori. Ada pun tujuan utamanya adalahmenghasilkan waktu eksekusi kode program yang lebih lebih pendek (cepat). Ini tentu merupakansesuatu yang sangat diharapkan sekali. Terkait dengan hal ini, sebagai pemrogram, apa yang haruskita lakukan untuk mengoptimasi kode program aplikasi PHP?Artikel ini akan menjelaskan tip-tip praktis untuk mengoptimasi dan meningkatkan performansiaplikasi web PHP.Optimasi Kode Program PHPTidak bisa dipungkiri, menulis kode secara efektif dan efisien adalah kunci dasar yang penting untukmeningkatkan kecepatan eksekusi kode. Seperti diketahui, kode-kode PHP akan selalu dieksekusisetiap kali ia di-request oleh client (browser). Oleh karena itu, sangat menguntungkan sekali jikaAnda bisa membuat kode yang efektif dan efisien.Berikut ini adalah beberapa tip dan strategi untuk mengoptimasi kode program aplikasi PHP secaraumum.• Hindari spasi untuk mengatur kodeMenghindari penggunaan spasi (atau  ) yang berlebihan adalah langkah efisien.Pertimbangkan, setiap spasi adalah 1 byte dan setiap tab (\t) juga 1 byte. Ketika Anda membuatempat spasi, Anda telah menghabiskan 4 byte data. Tentu akan lebih efisien jika hanya

Page 7: Optimasi Php

menggunakan sebuah tab.• Cara menggunakan tipe data booleanPHP mengijinkan Anda menulis tipe data boolean dengan huruf kecil atau besar(case-insensitive). Meskipun demikian, penulisan dengan huruf kecil semua akan lebih cepatdibanding huruf besar. Ini dikarenakan, saat menemukan konstanta, PHP melakukan lookup hashnama konstanta.1

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Comif ($var = TRUE) {.....}// akan dieksekusi lebih cepatif ($var = true) {.....}Sebagai tambahan, saat bekerja dengan nilai boolean, menggunakan nilai 1 dan 0 lebih cepatdibanding true dan false.• Hindari konkatenasi string yang besarPada saat melakukan konkatenasi string, hindari penggabungan dengan string yang ukurannyabesar. Ini bisa menghambat eksekusi kode yang sebenarnya bisa ditampilkan dengan cepat.Contohnya seperti berikut:// Konkatenasi string yang besar$title = 'title';$body = '...a very large block...';echo "Subject: $title\n\n$body";// Menghindari konkatenasi string yang besar$title = 'title';$body = '...a very large block...';echo "Subject: $title\n\n";echo $body;• Mencetak outputTiga cara yang umum dilakukan untuk mencetak data ke output adalah: direct output, echo(), danprint(). Ketika kode program tidak mengandung kode-kode PHP, mencetak dengan direct outputlebih efektif dan efisien. Contoh direct output seperti berikut:// kode php?>Direct output// kode php?>Apabila kondisi Anda memerlukan untuk mencetak output dengan menggunakan fungsi(konstruksi bahasa) PHP, gunakan echo(), bukannya print(). Meskipun secara garis besar print()dan echo() memiliki tujuan sama, akan tetapi ada beberapa perbedaan esensial yang perludiperhatikan.Fungsi print() berperilaku seperti fungsi pada umumnya, dan memiliki nilai kembalian (return

Page 8: Optimasi Php

value) berupa integer 1. Dengan demikian, print() dapat digunakan sebagai bagian dari ekspresiyang lebih kompleks. Sementara itu, echo() mampu menerima lebih dari satu parameter sekaligus,dan tidak memiliki nilai kembalian.print 'String 1';echo 'String 1';// Menggunakan beberapa parameterecho 'String 1', "String 2", '...';Fungsi string echo() akan dieksekusi lebih cepat dibanding dengan print(). Perbedaan inidisebabkan karena fungsi print() akan mengembalikan status (integer) yang menyatakan apakahproses berhasil dilaksanakan atau tidak.Di sisi lain, echo() hanya menampilkan output saja dan tidak mengerjakan apa-apa lagi. Ada pundalam implementasinya, status nilai kembalian dari penggunaan fungsi string hampir tidakpernah diperlukan.• Memeriksa panjang string2

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.ComCara umum untuk memeriksa panjang karakter adalah dengan menggunakan fungsi strlen().Untuk tujuan yang sama, sebenarnya ada cara yang lebih cepat, yaitu menggunakan isset().Contohnya seperti berikut:if (strlen($str) < 5) {echo 'String must be at least 5 chars';}if (!isset($str{5})) {echo 'String must be at least 5 chars';}Seperti halnya kasus echo() dan print(), isset() memerlukan waktu eksekusi lebih pendek karenaia merupakan konstruksi bahasa.Konstruksi bahasa echo() juga mengijinkan Anda untuk memberikan lebih dari satu stringsebagai parameter. Menggunakan beberapa parameter akan lebih cepat dibanding mencampurvariabel ke dalam sebuah parameter tunggal. Contohnya seperti berikut:$a = 'Hello';$b = 'World';echo 'Say ' .$a. ' to ' .$b;// Lebih cepatecho 'Say ', $a, ' to ', $b;Pendekatan Berbasis ReferensiPendekatan berbasis referensi (passing-by-ref) seringkali menimbulkan salah interpretasi. Pertanyaanumum yang sering dilontarkan terkait dengan topik ini adalah, apakah referensi meningkatkanperformansi? Pada prinsipnya, referensi tidak menyediakan keuntungan performansi apapun untuktipe data string, integer, dan tipe-tipe skalar lainnya. Akan tetapi, lain lagi ceritanya jika referensidiimplementasikan pada tipe data gabungan (array dan objek).

Page 9: Optimasi Php

Untuk lebih jelasnya, perhatikan dua contoh fungsi sederhana berikut:// Menggunakan referensifunction UseReferensi(&$a) {$b = $a;$c = $a;}// Tanpafunction$b =$c =}referensiNoReferensi($a) {$a;$a;Pada kenyataannya, engine PHP (Zend Engine) tidak menciptakan duplikat variabel ketikamelakukan “pass by value”, tetapi menngimplementasikan reference-counted dan copy-on-writesecara internal. Dengan demikian, di fungsi pertama, $b dan $c memerlukan waktu lebih lama untukdi-set, karena referensi harus di-track. Sementara itu, $b dan $c di fungsi kedua hanya menunjuk kenilai asli $a, dan counter referensi di-increment. Hasilnya, fungsi kedua akan dieksekusi lebihcepat dibanding fungsi pertama.Di sisi lain, saat menggunakan referensi di fungsi yang menerima parameter berupa array atau objek,akan meningkatkan performansi. Ini disebabkan, tipe data array dan objek tidak menggunakancounting referensi. Dengan kata lain, jika menggunakan “pass by value” pada array atau objek, makaakan menciptakan multiple copy.Sebagai tambahan, di PHP 5, semua objek secara otomatis akan di-pass by reference. Jadi, Andatidak perlu lagi menambahkan operator & secara eksplisit.Flushing Output ke FileDalam upaya mencapai efisiensi, umumnya fungsi-fungsi input dan otuput (I/O) tidak langsung3

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Commenulis data ke file, begitu kita menginstruksikannya. Ada pun yang dilakukan adalah, menumpukke buffer dan baru menyimpan (menulis) ke disk dalam satu waktu.Agar operasi penulisan langsung dilaksanakan tanpa di-pending terlebih dahulu, gunakan fungsifflush(). Contohnya seperti berikut:$fp = fopen('c:/tmp/test.txt', 'w');fwrite($fp, 'Test flushing output');// Flushing output ke filefflush($fp);

Page 10: Optimasi Php

fclose($fp);Dalam beberapa kasus, ada kemungkinan penulisan file yang memanfaatkan fflush() mengakibatkanfile gagal dibaca. Apabila kasus seperti ini terjadi pada Anda, gunakan fungsi clearstatcache()sebelum Anda melakukan pembacaan isi file.Flushing Output ke BrowserSeperti halnya ketika melakukan flushing output ke file, Anda bisa melakukan flushing output kebrowser. Teknik ini bisa lebih meningkatkan pengiriman output ke browser. Implementasinya,sebaiknya Anda memisahkan proses yang cepat dan proses yang memerlukan waktu lebih.Sebagai ilustrasi, sebelum operasi query data selesai, Anda bisa mengirim informasi status terlebihdahulu. Dengan demikian, client tidak mendapati halaman blank ketika query sedang dilakukan.Contoh sederhananya seperti berikut:// Simulasi request user$keyword = 'Test Flushing';$jml = 1000;echo 'Searching ', $keyword;// Flushing output ke browserflush();echo '

Result : ';// Simulasi proses data besarfor ($i=1; $i<$jml; $i++) {echo $i, ' ', $keyword, '';}Fungsi flush() akan mengirimkan semua output yang secara internal di-buffer PHP ke web server.Dalam beberapa kasus, browser client mungkin tidak langsung menampilkan data begitu sudahdidapatkannya. Selain itu, beberapa versi Internet Explorer tidak akan menampilkan data sampai iamenerima sedikitnya 256 byte data. Untuk mengatasi masalah di Internet Explorer ini, Anda bisamengirim karakter kososng sebelum melakukan flushing output.Buffering Output AplikasiBuffering output merupakan salah satu teknik yang digunakan untuk mengurangi waktu eksekusioutput kode. Ide dasar dari teknik ini adalah, menyimpan semua isi halaman web ke dalam buffermemori sebelum kemudian dikeluarkan secara bersamaan. Jadi, output aplikasi tidak langsungdikirimkan ke browser client.Keuntungan yang bisa Anda peroleh dengan melakukan buffering output antara lain:• Mengurangi operasi-operasi I/O guna meningkatkan performansi. Di mana operasi-operasi I/Obisa dilakukan secara sekuensial dan dengan cepat.• Mengijinkan Anda untuk memodifikasi isi halaman web sebelum kemudian dikeluarkan.Untuk mengimplementasikan buffering output, Anda cukup memanggil fungsi ob_start() di bagian

Page 11: Optimasi Php

atas kode program dan ob_end_flush() di bagian akhir program. Contoh implementasinya sepertiberikut:// Me-replace stringfunction callback($buff) {return (str_replace('unjuk kerja','performansi', $buff));4

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Com}// Aktifkan buffering outputob_start('callback');?>

Buffering output, untuk meningkatkanunjuk kerja

echo 'ob size: ', ob_get_length(), ' byte';// Mengirim buffer output dan disable bufferingwhile (ob_get_level() > 0) {ob_end_flush();}?>Sebenarnya, tanpa memanggil ob_end_flush() pun, data akan tetap dikeluarkan begitu kode selesaidiekseksui. Meskipun demikian, untuk menyeimbangkan kode, sebaiknya Anda memanggilob_end_flush().Dalam melakukan buffering output, Anda juga bisa menentukan sendiri ukuran buffer. Ukuran iniakan dijadikan sebagai batas jumlah data yang akan di-buffer. Selanjutnya, setiap buffer penuh, dataakan dikeluarkan ke browser client. Langkah ini bisa mencegah penggunaan memori yangberlebihan, ketika data cukup besar dan memori terbatas.Kompresi OutputKompresi output adalah salah satu teknik yang efektif dan efisien untuk meningkatkan performansiaplikasi. Apabila kompresi diaktifkan, ia akan mendeteksi entry khusus di request browser danmengkompres setiap output yang dikeluarkan oleh aplikasi. Selanjutnya, browser akanmen-dekompres data dari server sebelum ditampilkan ke user.Bagaimanapun juga, teknik kompresi memerlukan dukungan browser. Apabila browser tidak

Page 12: Optimasi Php

mendukung dekompresi, proses kompresi tidak akan berpengaruh. Umumnya, kebanyakan browsersaat ini memiliki kemampuan untuk menerima data terkompres.Ada dua pendekatan yang bisa Anda lakukan untuk mengkompres output aplikasi. Pertama, denganmelakukan konfigurasi langsung pada directive zlib di php.ini, dan kedua menggunakanfungsi-fungsi kontrol output. Contoh pendekatan pertama seperti berikut:zlib.output_compression= OnUntuk mendukung kompresi, Anda juga bisa menetapkan level kompresi.; minimal compressionzlib.output_compression_level= 1; maximal compressionzlib.output_compression_level= 9Semakin tinggi level kompresi, akan semakin kecil ukuran data yang dihasilkan. Akan tetapi, sebagaikonsekuensinya, ini memerlukan waktu lebih bagi CPU server untuk mengkompres data.Untuk pendekatan kedua, gunakan fungsi ob_start() dengan parameter ob_gzhandler().// Untuk menghindari konflik kompresiif (!ini_get('zlib.output_compression')) {// Buffering output dengan kompresiob_start('ob_gzhandler');echo 'kompresi dengan ob_gzhandler

';} else {echo 'kompresi dengan zlib.output_compression

';}for ($i=0; $i<10; $i++) {echo $i, ' Test kompresi ';5

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Com}echo 'size: ', ob_get_length();Pada prinsipnya, kedua pendekatan di atas memerlukan ekstensi zlib. Artinya, kedua pendekatantersebut tidak dapat bekerja seperti yang diharapkan apabila ekstensi zlib tidak aktif. Sebagaitambahan, Anda tidak dapat menggunakan kedua pendekatan tersebut secara bersamaan. Disarankan,Anda memilih pendekatan yang kedua, dibanding menggunakan ob_gzhandler().Caching Content AplikasiCaching content adalah teknik penyimpanan isi halaman (content) web yang di-generate secaradinamis dan selanjutnya bisa di-retrieve untuk ditampilkan ke browser client. Pendekatan ini

Page 13: Optimasi Php

sangatefisien sekali, karena memungkinkan Anda “mengubah” halaman dinamis PHP menjadi halamanstatis, melakukan buffering output, dan menyimpan ke suatu file.Untuk mengimplementasikan caching content, Anda bisa membuat kode program sendiri ataumemanfaatkan paket PEAR yang sudah tersedia. Mengingat caching ini sangat kompleks, akan lebihpraktis jika memanfaatkan paket Cache dari PEAR. Berikut ini contoh kode programnya:// Include class PEAR::Cache_Lite Outputrequire_once 'Cache/Lite/Output.php';// Konfigurasi option$opts = array('cacheDir''writeControl''readControl''readControlType');Cache_Lite=>=>=>=>'./cache/','true','true','md5'// Membuat objek Cache_Lite_Output$cache = new Cache_Lite_Output($opts);// Set lifetime caching (1 minggu)$cache->setLifeTime(302400);// Start caching dengan id headerif (!$cache->start('header', 'Static')) {?>

Simulasi Header Page

Last modified @

// Output di-buffer sampai pemanggilan// method end(), dan simpan ke cache

$cache->end();

Page 14: Optimasi Php

}// Simulasi content body dinamis

// Lifetime = 5 detik$cache->setLifeTime(5);

if (!$cache->start('body', 'Dynamic')) {echo 'Body already modified...

';echo 'Last modified @ ', date('H:i:s');

$cache->end();}

// Content footer, statis$cache->setLifeTime(302400);

if (!$cache->start('footer', 'Static')) {?>

Simulasi Footer Page

Last modified @

6

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Com

}$cache->end();

Gambar 1 Caching content aplikasi webProfiling Kode

Untuk mengukur dan menyimpulkan bahwa suatu fungsi atau konstruksi bahasa dieksekusi cepatatau lambat, tentu tidak bisa hanya berdasar analisis kode. Tool pengukuran yang dapat

merepresentasikan waktu eksekusi kode secara nyata adalah kode profiler.Pada prinsipnya, semua kode profiler PHP memiliki acuan dasar untuk melakukan pengukuran,misalnya dengan fungsi microtime() atau getrusage(). Secara garis besar, profiler mendapatkan

nilaieksekusi dengan rumus waktu eksekusi akhir (selesai) dikurangi waktu awal eksekusi.

Berdasarkan rumus global yang digunakan oleh kode profiler, Anda juga bisa membuat sendiri kode

profiler yang sederhana. Kode programnya seperti berikut:// Eksekusi fungsi ketika pemrosesan kode selesai

register_shutdown_function('testSummary');$timing = array();

function startTest($label, $fungsi, $iter=1) {global $timing;

echo 'Testing ', $label, '';

Page 15: Optimasi Php

// Flushing output bufferob_flush();

$start = currTime();// Memanggil fungsi yang dispesifikasikan

call_user_func($fungsi, $iter);$timing[$label] = currTime() - $start;

return $timing[$label];}

function testSummary() {global $timing;

if (empty($timing)) {return;

}// sort reverse elemen array

arsort($timing);// Set pointer ke elemen pertama

reset($timing);$slowest = current($timing);

// Set pointer ke elemen terakhirend($timing);

echo '

The Winner is: ', key($timing), '

';echo '';

foreach ($timing as $label => $time1) {echo '';

}echo '';

7

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Com

}$copy = $timing;

foreach ($copy as $label => $time1) {echo '\n", $time1);

foreach ($timing as $label2 => $time2) {$percent = (($time2 / $time1) - 1) * 100;

if ($percent > 0) {printf("';

}echo '';

}echo '

Page 16: Optimasi Php

Contestants ', $label, '

', $label, '';printf("%.3f seconds

%.3f seconds %.1f%% slower", $time2, $percent);} elseif ($percent < 0) {printf("

%.3f seconds %.1f%% faster", $time2, -$percent);} else { // sama dengan 0echo '

-';}

echo '

';// Get current time (format Unix)

function currTime() {list($usec, $sec) = explode(' ', microtime());

return ((float)$usec + (float)$sec);}

?>Cara menggunakan kode profiler di atas seperti berikut:

require_once './myprofiler.php';$arr = array('a'=> 'satu', 'b'=> 'dua',

'c'=> 'tiga', 'd'=> 'empat', 'e'=> 'lima');$loops = 1000000;

startTest('array_key_exists()','use_key', $loops);startTest('isset()', 'use_isset', $loops);

function use_key($loops) {global $arr;

for ($i=0; $i<$loops; $i++) {if (array_key_exists('c', $arr)) {

// elemen ditemukan} else { exit('err1...'); }

}}

function use_isset($loops) {global $arr;

for ($i=0; $i<$loops; $i++) {if (isset($arr['c'])) {// elemen ditemukan

} else { exit('err2...'); }}}

?>Hasil dari pengujian kurang lebih akan terlihat seperti Gambar 2.

8

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.ComGambar 2 Pengujian dengan kode profiler

Apabila Anda merasa kurang puas dengan kinerja kode profiler di atas, sebagai tambahan, gunakan

Page 17: Optimasi Php

paket Benchmark yang tersedia di PEAR. Implementasinya seperti berikut:// Include class PEAR::Benchmark Iterate

require 'Benchmark/Iterate.php';$arr = array('a'=> 'satu', 'b'=> 'dua',

'c'=> 'tiga', 'd'=> 'empat', 'e'=> 'lima');$loops = 1000; // loop 1000 kali

function use_key($arr) {global $loops;

for ($i=0; $i<$loops; $i++) {if (array_key_exists('c', $arr)) {

// elemen ditemukan} else { exit('err1...'); }

}}

function use_isset($arr) {global $loops;

for ($i=0; $i<$loops; $i++) {if (isset($arr['c'])) {// elemen ditemukan

} else { exit('err2...'); }}}

$timer =& new Benchmark_Iterate;$timer->run($loops,'use_key', $arr);

$res1 = $timer->get();$timer->run($loops,'use_isset', $arr);

$res2 = $timer->get();echo '

Summary

';echo "

Mean execution time of key: $res1[mean]";echo "

Mean execution time of isset: $res2[mean]";Akhirnya, sampai di sini pembahasan mengenai sedikit tip dan trik untuk mengoptimasi danmeningkatkan aplikasi web PHP. Bagaimanapun juga, pembahasan mengenai performansi

sangatlahkompleks, dan dipengaruhi faktor-faktor terkait, seperti web server dan database server.

Artikel ini merupakan salah satu pembahasan dari buku penulis yang berjudul “101 Tip dan TrikPHP“, dan mudah-mudahan bisa menjadi referensi yang bermanfaat.

ReferensiPEAR Manual, PEAR Documentation Group, 2005.

Page 18: Optimasi Php

9

Tips dan Trik IlmuKomputer.ComCopyright ©2003-2006 IlmuKomputer.Com

PHP Manual, PHP Documentation Group, 2005.http://www.zend.com/BIOGRAFI PENULIS

Didik Dwi Prasetyo. Lahir di Bojonegoro, 30 September 1979. Menyelesaikan program S1 jurusan Teknik

Informatika di Universitas Ahmad Dahlan, Jogjakarta, pada tahun 2004.Kompetensi inti adalah pada bidang Software Engineering dan Database Management System.

Kegiatan yangditekuni sampai sekarang adalah pemrogram freelance dan sebagai penulis buku-buku komputer

di PT. ElexmediaKomputindo (Gramedia Group).

Informasi lebih lanjut tentang penulis ini bisa didapat melalui:Email: [email protected]

http://groups.yahoo.com/group/didik_directory

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Optimasi Skrip PHP Anti Hacking Situs anda pernah di-hack? Jika anda pernah mengalami situasi tersebut, mungkin anda pernah membaca atau bahkan mencoba skrip ini. Namun jika belum, tak ada salahnya anda mulai memperbaiki skrip program situs anda dan mencoba tip kecil ini.

Salah satu teknik hacking yang cukup sering dilakukan adalah dengan memasukkan skrip SQL ke dalam system server situs anda lewat layanan-layanan yang tersedia di situs anda misalnya, guestbook, formulir komentar, shout box, polling dan sebagainya.Teknik ini sering dinamakan dengan SQL Injection. Namun jangan salah, bukan hanya lewat layanan-layanan yang ada inputan-nya saja seorang hacker bisa mengacak-acak data di sistem anda. Bisa juga dengan memasukkan URL yang telah disisipi perintah SQL-pun data sebuah situs menjadi berantakan.

Teknik ini memanfaatkan kelemahan penggunaan query SQL dari sebuah aplikasi web yang memungkinkan seseorang memasukkan perintah-perintah SQL lewat aplikasi yang disediakan tadi. Lubang ini ada karena kurang jelinya seorang programmer mengenali data-data input yang bakal diisikan oleh pengunjung situs dan hanya berharap, semua pengunjung “pasti” memasukkan data sesuai petunjuk yang diberikan.

Salah satu lubang yang biasanya (umum) ditinggalkan oleh seorang programmer adalah penggunaan langsung data input yang diperoleh dari sebuah FORM dengan metode $_GET maupun $_POST ke dalam query SQL. Padahal bisa jadi data yang diinput tersebut mengandung perintah SQL yang memungkinkan pihak yang tidak diijinkan masuk ke dalam sistem web yang anda buat dan kemudian mengacak-acak data anda.

Page 19: Optimasi Php

Sebagai ilustrasi, coba perhatikan contoh berikut. Misalnya anda memiliki sebuah form dengan input berupa login dan password. Katakanlah, seorang user harus memasukkan sebuah login berupa email dan password yang sesuai dengan akun tersebut agar bisa masuk ke dalam sistem anda. Katakanlah perintah SQL-nya sebagai berikut.

HTML Code:SELECT email, password, name from nama_tabel where email=’email_anda’Jika user memasukkan email yang tepat misalnya [email protected] maka semuanya bakal aman-aman saja. Namun bagaimana jika seseorang memasukkan data “[email protected]’ OR 1=’1“, jika skrip anda secara polos langsung memasukkan data yang ada ke dalam query SQL pastinya skrip aplikasi anda akan mengeksekusi query SQL sebagai berikut.

Code:SELECT email, password, name from nama_tabel where email=’[email protected]’ OR 1=’1’ Itu artinya apapun email yang anda masukkan, akan dibiarkan masuk. Toh, ada perintah 1=1 yang pasti benar dong.Sekarang anda bayangkan jika user memasukkan data “[email protected]’ ; INSERT INTO nama_tabel (email,password),values(‘[email protected]’,’passwor d_saja’);–Tentunya akan ada seorang user illegal di dalam database anda yang siap mengacak-cak system yang anda buat.

Kemudian, coba bayangkan juga apa jadinya jika user tersebut masukkan juga skrip lain yang lebih berbahaya misalnya “[email protected]’ OR 1=’1’;DROP TABLE nama_table;–“Hasilnya bisa jadi sebuah bencana bagi database pemilik situs. “Nah kini anda harusnya telah sadar aplikasi web anda perlu PERLINDUNGAN!!

Ada beberapa hal yang bisa anda lakukan untuk membuat aplikasi anda (khususnya PHP) lebih aman seperti berikut ini.

1. Deteksi apakah setiap input yang dimasukkan user mengandung karakter-karakter yang mungkin saja adalah sebuah sintak SQL. PHP menyediakan perintah mysql_real_escape_string() di versi 4.3.0 dan sesudahnya atau mysql_escape_string() di versi sebelumnya. Perintah ini akan mengubah input yang mengandung karakter backslahes ke dalam format karakter string yang sebenarnya. Misalnya karakter ‘ akan ditampilkan sebagai \’, baris baru sebagai \n dan sebagainya. Perintah mysql_real_escape_string() lebih efektif daripada mysql_escape_string() karena memformat standar karakter backslashes yang terbaru. Versi PHP yang lebih lama lagi menggunakan perintah addslashes() untuk tujuan yang sama. Jangan lupa untuk menggunakan perintah-perintah tersebut sekalipun aplikasi anda hanya memanggil fungsi SELECT karena bisa saja user mengubah URL anda sambil memasukkan query SQL.

Contoh penggunaannya: $string_baru = mysql_real_escape_string($string_lama); Atau $string_baru = mysql_escape_string($string_lama);

Page 20: Optimasi Php

2. Gunakan fungsi get_magic_quotes_gpc() untuk melihat apakah setting backslashes anda telah aktif . Ini perlu digunakan sebelum anda melakukan proses nomor 1 agar tidak terjadi backslashes ganda.

Contoh skripnya adalah sebagai berikut jika dikombinasikan dengan tip nomor 1.

Code:if(get_magic_quotes_gpc()){ $string = stripslashes($string); } if (phpversion() >= '4.3.0'){ $string = mysql_real_escape_string($string); }else{ $string = mysql_escape_string($string); }3. Gunakan Bound Parameter. Untuk menghasilkan query SQL yang anda inginkan (dengan memasukkan parameter dari input) bias dengen beberapa cara. Namun cara tersebut bisa jadi cara yang aman atau sebaliknya.

Cara kurang aman : $q = “SELECT * from namatable where param1=’”.$param1.”’”;

Cara lebih aman : $q = sprintf("SELECT * FROM namatable WHERE param1='%s'", $param1);

4. Batasi parameter input yang aplikasi anda terima dari kemungkinan perintah-perintah SQL yang berbahaya misalnya INSERT, DELETE, DROP, UPDATE ,UNION, serta --.

Contohnya seperti dibawah ini.

$badWords = "(delete)|(update)|(union)|(insert)|(drop)|(http)| (--)"; $string = eregi_replace($badWords, "", $string);

5. Biasakan menggunakan metode $_POST yang tidak memperlihatkan parameter yang terkirim ke server untuk diproses ketimbang $_GET.

6. Batasi jumlah karakter yang bisa digunakan dalam sebuah form login maupun aplikasi lain yang memungkinkan pengunjung memasukkan data apapun

7. Amankan database anda dengan hanya memberi akses terbatas ke user tertentu saja

8. Gunakan stored procedures untuk mengakses database anda. Dengan fasilitas ini, anda bisa mencegah kerusakan lebih parah karena fungsi-fungsi tertentu misalnya INSERT. UPDATE, atau DELETE hanya bisa diakses oleh user tertentu secara terbatas.

9. Buatlah fasilitas error reporting di situs anda untuk setiap aktifitas yang mungkin bermasalah atau illegal. Misalnya ketika seseorang mengakses URL yang sama secara terus menerus dalam periode tertentu, sistem peringatan dini mengirimkan email kepada anda.

Page 21: Optimasi Php

Bagaimana menurut anda? Apakah skrip PHP aplikasi anda sudah aman? Ayo benahi skrip anda sekarang juga.