Sedikit cara Optimasi aplikasi web dengan PHP

Sedikit cara untuk meng-optimasi aplikasi website memang sangat2 penting, untuk scala kecil, cara ini sih emang ga bakal ada pengaruhnya, tp klo untuk scala besar, beda 1 per sekian detik aja sangat -sangat membantu, seperti orang bijak bilang, "batu kecil memang tidak melukai, tapi bisa membuat kita tergelincir". 

Berikut adalah hal-hal yang perlu diperhatikan dalam membuat coding PHP :
1. Hindari penggunaan spasi secara berlebihan.
Menghindari penggunaan spasi (atau  ) yang berlebihan adalah langkah efisien. Coba anda bayangkan setiap spasi memerlukan 1 byte data, sedangkan setiap tab (\t) juga 1 byte. Ketika kita membuat empat spasi,  berarti kita telah menghabiskan 4 byte data. Tentu akan lebih efisien jika hanya menggunakan sebuah tab saja.

2. Penggunaan tipe data Boolean.
PHP mengijinkan Anda menulis tipe data boolean dengan huruf kecil atau besar (case-insensitive). Meskipun demikian, penulisan dengan huruf kecil semua akan lebih cepat dibanding huruf besar. Ini dikarenakan, saat menemukan konstanta, PHP melakukan lookup hash nama konstanta. Misalnya :

if($var == TRUE) { ...... }

akan lebih efisien jika ditulis,
if($var == true) { ....... }

dan akan lebih cepat lagi jika kita menggunakan 1 dan 0 dari pada true and false.

3.Hindari konkatenasi string yang besar.
Pada saat melakukan konkatenasi string, hindari penggabungan dengan string yang ukurannya besar. Ini bisa menghambat eksekusi kode yang sebenarnya bisa ditampilkan dengan cepat. Contohnya seperti berikut:

$title = 'pendek';
$body = '...ini kalimat yang lebih panjang...';


// Konkatenasi string yang besar
echo "Hasilnya: $title\n\n$body";

// Akan lebih baik jika ditulis seperti ini
echo "Hasilnya: $title\n\n";
echo $body;


4. Penggunaan echo() dan print().
Tiga cara yang umum dilakukan untuk mencetak data adalah: echo() dan print()
. Apabila untuk mencetak output dengan menggunakan fungsi (konstruksi bahasa) PHP, sebaiknya gunakan echo(), bukannya print(). Meskipun secara garis besar print() dan echo() memiliki tujuan sama, akan tetapi ada beberapa perbedaan esensial yang perlu diperhatikan. Fungsi print() berperilaku seperti fungsi pada umumnya, dan memiliki nilai kembalian (return value) berupa integer 1. Dengan demikian, print() dapat digunakan sebagai bagian dari ekspresi yang lebih kompleks. Sementara itu, echo() mampu menerima lebih dari satu parameter sekaligus,
dan tidak memiliki nilai kembalian.


print 'coba 1';
echo 'coba 1';


// Menggunakan beberapa parameter
echo 'Coba 1', "Coba 2", '...';

 
Fungsi string echo() akan dieksekusi lebih cepat dibanding dengan print(). Perbedaan ini disebabkan karena fungsi print() akan mengembalikan status (integer) yang menyatakan apakah proses berhasil dilaksanakan atau tidak. Di sisi lain, echo() hanya menampilkan output saja dan tidak mengerjakan apa-apa lagi. Ada pun dalam implementasinya, status nilai kembalian dari penggunaan fungsi string hampir tidak pernah diperlukan.


Konstruksi bahasa echo() juga mengijinkan kita untuk memberikan lebih dari satu string sebagai parameter. Menggunakan beberapa parameter akan lebih cepat dibanding mencampur variabel ke dalam sebuah parameter tunggal. Contohnya seperti berikut:
$a = 'Coba';
$b = 'Lagi';


//mencampur menjadi parameter tunggal
echo 'Harus ' .$a. ' dipahami ' .$b;
 

//akan lebih cepat
echo 'Say ', $a, ' to ', $b;




5. Mengetahui panjang string.
Biasanya untuk mengetahui panjang karakter dari suatu string adalah dengan menggunakan fungsi strlen(). Untuk tujuan yang sama, sebenarnya ada cara yang dinilai lebih cepat, yaitu menggunakan isset(). Contohnya seperti berikut:

if (strlen($str) < 10) {
echo 'Panjang karakter harus 10 ya';
}


//akan lebih cepat
if (!isset($str{10})) {
echo 'Panjang karakter-nya kurang/lebih dari 10 tuh';
}

Seperti halnya kasus echo() dan print(), isset() memerlukan waktu eksekusi lebih pendek karena  isset() merupakan konstruksi bahasa.


6. Penggunaan kondisi perbandingan antara variabel dengan konstanta.
Kita dalam penggunaan kondisi perbandingan antara variabel dengan konstanta seperti ini :
if($var == '4') { .... }, tetapi akan lebih cepat apabila konstanta disebutkan terlebih dahulu,
if('4' == $var) { .... }.


Gimana guys, hal-hal simple bukan ?? Ini hanya beberapa cara sederhana untuk mengoptimasi aplikasi PHP, masih banyak faktor lain yg berpengaruh untuk masalah ini, mulai dari server dan databasenya.

Progress Bar MultiFile Upload di PHP 5.

Wah2, dah lama banget nih ga bikin tutorial, materi yg mau di tulis sih banyak, cuma waktunya aja yg ga memungkinkan, sampe-sampe materi yg udah disiapin, lupa deh nyimpennya dimana. Well2, kita mulai lagi tutorialnya dari bagaimana membuat Progress Bar MultiFile Upload di PHP.

Sebenernya udah banyak tutorial yg bicara soal Progress Bar di PHP, lengkapnya bisa masuk ke sini, tp itu untuk 1 file saja, nah disini ane coba membuat progress bar untuk multi file, dalam arti-an macam kirim email melalui yahoo or gmail gitu, bisa langsung attach file lebih dari 1, OK kita mulai y......

Berpedoman pada link di atas tuh, ane anggap ente dah bisa install APC dan berjalan dengan baik untuk upload 1 file, klo blum, coba pelajari link di atas dengan seksama, disitu udah super duper lengkap kok. Kemudian yg perlu disiapkan adalah file jquery.js dan jquery.MultiFile.js, berikut adalah script yg diperlukan :

Javascript-nya :

<script src="jquery.js" type="text/javascript" language="javascript"></script>
<script src="jquery.MultiFile.js" type="text/javascript" language="javascript"></script>
<script>
function createRequestObject() 
{
    var requestObject;
    requestObject = false;
    if( window.ActiveXObject ){
        for( var i = 5; i; i-- ){
            try{
               if( i == 2 ){
                requestObject = new ActiveXObject( "Microsoft.XMLHTTP" );    
            }else{        
                requestObject = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
            }
            break;
          }catch( excNotLoadable ){                        
                requestObject = false;
          }
        }
    }else{
        requestObject = new XMLHttpRequest();
    }
    return requestObject;
}


var http = createRequestObject();


function postForm(formName){
  document.getElementById(formName).submit();
  setTimeout('updateProgress()', 100);
}

function updateProgress(){ 
  progress_key = document.getElementById('progress_key').value;
  http.open("GET", 'upload.php?progress_key='+progress_key, true);
    http.onreadystatechange = function () {
        if (http.readyState == 4) {
            if (http.status == 200) {
              the_object = eval("(" + http.responseText + ")");            
              if(!the_object.done){
               result = Math.round((the_object.current/the_object.total) * 100);
                var hasil = Math.round((result/100)*200);
                var xxx = "<div style='width:200px;border:1px solid #000;float:left;'><div style='background:#F00;width:"+hasil+"px;display:block;'>&nbsp;</div></div><div style='float:left;'>"+result+"%</div>";
                
                document.getElementById('progress_win').innerHTML = xxx;
                setTimeout("updateProgress()",500);
              }else{
                var xxx = "<div style='width:200px;border:1px solid #000;float:left;'><div style='background:#F00;width:200px;display:block;'>&nbsp;</div></div><div style='float:left;'>100%</div>";
                document.getElementById('progress_win').innerHTML = xxx;
              }
            }
        }
    }
  http.send(null);
}
</script>


Ini Css-nya :

<style>
.realupload  {
position:absolute;
top:1;
right:1;
left:0;
cursor: pointer;
/* start of transparency styles */
opacity:0;
-moz-opacity:0;
filter:alpha(opacity:0);
/* end of transparency styles */
z-index:2; /* bring the real upload interactivity up front */
}
</style>




Ini script HTML-nya :

<body>
<form action="upload.php" name="send" id="send-form" class="form-style" method="POST" onsubmit="postForm('send-form');" enctype="multipart/form-data">
<div>
<a id="pick-filez" style="cursor: pointer;">SELECT FILE</a><br/>
<!-- APC_UPLOAD_PROGRESS untuk memberikan nilai uniq kepada APC, untuk menghindari penggunaan secara bersamaan -->
<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<? echo uniqid();?>"/>
<input type="file" name="multi_file[]" id="realupload" class="multi realupload"/>
</div>
<input type="submit" name="upload" id="send-button" value="UPLOAD"/>
<br>
<? echo "<font color='#FF0000'>$msg</font>";?>
<div id="progress_win"></div>
</form>
</body>




Dan ini PHP-nya :

<?php
if($_SERVER['REQUEST_METHOD']=='POST') {
    $uploaddir = 'uploads_file/';
    $msg = "Tidak ada file yang di upload";
    foreach ($_FILES["multi_file"]["error"] as $key => $error)
    {
        if ($error == UPLOAD_ERR_OK)
        {
            $tmp_name = $_FILES["multi_file"]["tmp_name"][$key];
            $name = date("YmdHis").".".$_FILES["multi_file"]["name"][$key];
            $uploadfile = $uploaddir . basename($name);
            
            if(move_uploaded_file($tmp_name, $uploadfile))
            {
             $msg = "Upload MultiFile Berhasil";
            }
        }
    } 
}
else if(isset($_GET['progress_key'])) {
  $status = apc_fetch("upload_$_GET[progress_key]");
  echo json_encode($status);
  exit;
}
?>

Semua script2 diatas di jadiin satu file, dan bisa langsung dicoba........ untuk file lengkapnya bisa lihat yg ini. Simple bukan ?? ane jg kebetulan lagi pake fungsi ini buat bikin aplikasi mirip-mirip YouSendIt gt, ente tinggal modifikasi sesuai kebutuhan aj.