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.




Update & Delete file video youtube dengan PHP

Setelah kita berhasil upload video langsung ke youtube melalui website kita, selanjutnya bagaimana caranya untuk mengubah atau menghapus file yang bersangkutan. Langkah awalnya sama dengan postingan ane sebelumnya, bagaimana cara upload file video ke youtube. Konfigurasi awalnya pun juga sama, yg beda hanya bagian prosesnya saja.

Berikut adalah script untuk mengubah / update :

<?php
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); 

$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin';
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
              $username = 'youremail@mail.com',
              $password = 'yourpassword',
              $service = 'youtube',
              $client = null,
              $source = 'MazhtersSource', // untuk identifikasi aplikasi kita
              $loginToken = null,
              $loginCaptcha = null,
              $authenticationURL);


$developerKey = 'developerKey';
$applicationId = 'Test Upload Video';
$clientId = 'Test Upload Video Client';

$yt = new Zend_Gdata_YouTube($httpClient, $applicationId, $clientId, $developerKey);

$videoEntry = new Zend_Gdata_YouTube_VideoEntry();


$feed = $yt->getVideoFeed('http://gdata.youtube.com/feeds/users/default/uploads');
foreach($feed as $entry) 
{
if($entry->getVideoId() == $video_id)
{
$videoEntry = $entry;
$videoEntry->setVideoTitle('ini title yg baru');
                $videoEntry->setVideoDescription('ini description yg baru');
                $putUrl = $videoEntry->getEditLink()->getHref();



                $yt->updateEntry($videoEntry, $putUrl);
                break;
}
}


echo "Update File Video Sukses";


?>

Sedangkan untuk menghapus / delete bisa menggunakan script berikut :


<?php
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); 

$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin';
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
              $username = 'youremail@mail.com',
              $password = 'yourpassword',
              $service = 'youtube',
              $client = null,
              $source = 'MazhtersSource', // untuk identifikasi aplikasi kita
              $loginToken = null,
              $loginCaptcha = null,
              $authenticationURL);

$developerKey = 'developerKey';
$applicationId = 'Test Upload Video';
$clientId = 'Test Upload Video Client';

$yt = new Zend_Gdata_YouTube($httpClient, $applicationId, $clientId, $developerKey);

$videoEntry = new Zend_Gdata_YouTube_VideoEntry();

$feed = $yt->getVideoFeed('http://gdata.youtube.com/feeds/users/default/uploads');




$videoEntryToDelete = null;

foreach($feed as $entry) 
{
if ($entry->getVideoId() == $file_media)
{
$videoEntryToDelete = $entry;
                $yt->delete($videoEntryToDelete);
break;
}
}

echo "Delete File Video Sukses";


?>

Script2 diatas ane berasumsi bahwa file berhasil di update atau di delete, ente-ente bisa memodifikasi dengan menambahkan pesan error apabila file gagal terupdate / terdelete.

Upload video ke Youtube dengan PHP

Wah2 udah 2 bulan lebih nggak nulis blog nih, coz kerjaan yg super duper padat dan ga bisa ditinggalkan. Mumpung skrg lg rada longgar, dan kebetulan juga baru aj dapet ilmu baru, wajib hukumnya untuk berbagi dengan ente-ente semua.

Sesuai dengan judulnya, mengupload video dari website kita langsung ke youtube kayaknya lg trend bgt nih, di lihat dari berbagai sudut pandang, banyak keuntungan yg didapet. Yang paling mendasar adalah space di hosting kita, tentunya kita tidak perlu menyiapkan space lebih untuk menyimpan file video. Yang  kedua adalah video yg kita upload lebih besar kemungkinannya untuk dilihat oleh khalayak banyak, sepertinya ga perlu ane dijelasin lg apa alasannya.

Dalam membuat engine ini, tutorial lengkapnya bisa dilihat di sumbernya langsung, tp disini ane akan coba jelaskan menggunakan bahasa kita yang mungkin akan mudah dimengerti.

Syarat utama adalah kita mesti punya account youtube dan account google dengan menggunakan email yg sama (tidak harus menggunakan gmail, bisa apa aj) sebab nanti kita harus mendapatkan DeveloperKey melalui account di google, ente bisa masuk kesini buat dapetin DeveloperKey.

Kedua yg harus diperhatikan adalah bahwa engine ini hanya bisa running dengan menggunakan PHP >= 5.1.3, jadi yg masih pake versi PHP dibawah itu, buru-buru di upgrade deh. Kita juga harus menyiapkan Zend_Gdata >= 1.7.7. yg bisa diunduh di sini. Langkah selanjutnya buka file php.ini dan bagian extension=php_openssl.dll di hapus titik komanya ( ; ). Kemudian tambahkan juga include_path=".:/user/local/lib/php:/path/to/ZendGData/library, jika masih di localhost, bagian terakhir ini bisa diabaikan.

Setelah persiapan selesai, kita tinggal menggunakan script berikut untuk memulainya.


<?php
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); 


$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin';
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
              $username = 'youremail@mail.com',
              $password = 'yourpassword',
              $service = 'youtube',
              $client = null,
              $source = 'MazhtersSource', // untuk identifikasi aplikasi kita
              $loginToken = null,
              $loginCaptcha = null,
              $authenticationURL);


$developerKey = 'developerKey';
$applicationId = 'Test Upload Video';
$clientId = 'Test Upload Video Client';


$yt = new Zend_Gdata_YouTube($httpClient, $applicationId, $clientId, $developerKey);


// create a new VideoEntry object
$myVideoEntry = new Zend_Gdata_YouTube_VideoEntry();
$myVideoEntry->setVideoTitle('ini title videonya');


$myVideoEntry->setVideoDescription('ini descripsi videonya');
// The category must be a valid YouTube category!
$myVideoEntry->setVideoCategory('ini categorinya');


// Set keywords. Please note that this must be a comma-separated string
// and that individual keywords cannot contain whitespace
$myVideoEntry->SetVideoTags('ini tag videonya'); // biar gampang dicari


$tokenHandlerUrl = 'http://gdata.youtube.com/action/GetUploadToken';
$tokenArray = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);
$tokenValue = $tokenArray['token'];
//$postUrl = $tokenArray['url'];


$nextUrl = 'www.mazhters.com'; // url setelah sukses upload video


// build the form
$form = '<form action="'. $postUrl .'?nexturl='. $nextUrl .
        '" method="post" enctype="multipart/form-data">'. 
        '<input name="file" type="file"/>'. 
        '<input name="token" type="hidden" value="'. $tokenValue .'"/>'.
        '<input value="Upload Video File" type="submit" />'. 
        '</form>';
echo $form;
?>


Ok guys, itu aj langkah-langkahnya, dan bisa langsung dicoba upload vidoenya.

MOLAP, ROLAP dan HOLAP.

Sebelum membahas lebih jauh pengertian dari judul diatas, ada baiknya kita review sedikit pengertian dari OLAP itu sendiri. OLAP (On-Line Analytical Processing) adalah Database Multidimensional pada sistem analisa data tingkat lanjut yang mendukung pengambilan keputusan, bisnis model, dan aktifitas riset.

OLAP menyediakan cara untuk menampilkan data Multi Dimensional yang ada dalam Data Mart atau Data Warehouse, dengan OLAP dapat dibuat Cube yang mengorganisasikan data dan membuat summary data untuk query yang effisien.

Karakteristik OLAP
- Menggunakan teknik analisa data Multidimensional
- Menyediakan dukungan database tingkat lanjut
- User Interface yang mudah difahami.
- Mendukung arsitektur Client/Server

Dalam dunia OLAP, ada dua jenis teknik penyimpanan data yang utama: Multidimensional OLAP (MOLAP) dan Relational OLAP (ROLAP). Sedangkan gabungan antara keduanya dinamakan Hybrid OLAP (HOLAP). Ada beberapa istilah lain di dalam dunia OLAP yang merupakan perluasan dari MOLAP dan ROLAP yaitu DOLAP(Desktop OLAP), WOLAP(Web-base OLAP) dan RTOLAP(Real-Time OLAP). Dan berikut adalah perbedaan antara MOLAP dan ROLAP:


MOLAP
Ini adalah cara tradisional dalam analisis OLAP. Dalam MOLAP data disimpan dalam bentuk Multidimensional Database. Tidak seperti basis data relasional yang menyimpan data dalam jumlah baris dalam tabel, sebuah data multidimensional menyimpan data dalam sejumlah array multidimensional. Karena dimensi dapat diakses secara mudah, maka user dapat melakukan query pada basis data MOLAP dengan sangat cepat. Selain mengandung data mentah, basis data MOLAP juga mengandung agregasi data sehingga dapat memberikan respon yang cepat terhadap query.

Plus (+) :
– Performance hebat, karena MOLAP memang dibangun untuk pengambilan data yang cepat dan optimal.
– Dapat membentuk kalkulasi yang komplek dan cepat.

Minus (-) :
– Jumlah volume data yang dapat ditangani terbatas.


ROLAP
Merupakan cara lain yang digunakan untuk melakukan partisi menggunakan tabel relasional dalam data warehouse. Banyak orang berpendapat bahwa basis data yang dirancang secara khusus untuk sebuah keperluan analisis tidak dibutuhkan karena sebuah basis data relasional sudah cukup mampu untuk menampilkan data OLAP. Hal ini hanya berlaku pada tingkat tertentu saja, pada sebuah basis data yang terdiri dari ribuan atau ratusan ribu records maka menampilkan data OLAP akan menjadi sebuah masalah, karena banyak data yang harus diquery. Dan hal ini lah yang menjadi keterbatasan partisi ROLAP.

Plus (+) :
– Dapat menangani jumlah volume data yang sangat besar, batasan ukuran volume data yang ditangani pada
teknologi ROLAP adalah batas dari volume dari Relational Database yang dipakai. Dengan kata lain pada ROLAP sendiri tidak ada batasan volume data.
– Dapat memanfaatkan fungsi-fungsi yang ada pada Relational Database yang dipakai.

Minus (-) :
– Performance dapat lambat, karena setiap ROLAP report pada dasarnya adalah SQL Query pada Relational Database, waktu query dapat lebih lama jika volume data semakin besar.
– Fungsi SQL yang terbatas, karena teknologi ROLAP terutama tergantung pada pembentukan statement Query pada Relational Database, dan tidak semua kebutuhan dapat terpenuhi dengan SQL Statement. ROLAP vendor telah mengantisipasi resiko ini dengan cara membuat Tool out-of-the-box untuk fungsi-fungsi yang kompleks bahkan memungkinkan user untuk mendefinisikan fungsi-fungsi yang dibutuhkannya sendiri.


HOLAP
Hybrid OLAP,  menggabungkan kedua teknologi diatas. HOLAP menggunakan Relational Database untuk menyimpan Detail data dan menggunakan Multidimensional Database untuk menyimpan Aggregate-nya. HOLAP services dapat menggunakan data MOLAP dan ROLAP secara simultan untuk memecahkan suatu query.