Archive

Posts Tagged ‘php’

HTTP Class

January 5th, 2009

Class buat GET dan POST pake PHP, mengsimpelkan pemanggilan ke website laen, bisa buat REST juga

<?
  if (!extension_loaded("curl")) dl("curl.so"); // USed for MWN
 
  function HTTPPost($data , $url , $referer) {
    $ch = curl_init();
    $proxy = getOneProxy();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Set supaya return value nya ke string
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($ch, CURLOPT_POST, 1);
//    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0);
//    curl_setopt($ch, CURLOPT_PROXY, $proxy);
//    echo "Using proxy $proxy\n";
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $retval = curl_exec($ch);
//    echo $retval;
    curl_close($ch);
  }
 
  function HTTPGet($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Set supaya return value nya ke string
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_REFERER, "");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
    $retval = curl_exec($ch);
    return $retval;
    curl_close($ch);
  }
 
  function doREST($url, $params) {
    if ($params) {
      foreach($params as $key => $param) {
        $_par[] = "$key=" . urlencode($param);
      }
      $_complete = "?";
      $_complete .= implode("&" , $_par);
    }
    return HTTPGet($url . $_complete);
  }
 
 
 
?>
Share

web , , , ,

Database class

January 5th, 2009

Dulu ini gue buat sebelum PHP mempunya Class DB sendiri. Class ini dipake di berbagai project gede juga loh :P huehuehe� tapi sekarang dengan adanya CI, jadi udah engga dipake lagi. Dan juga ada beberapa branch dari script ini sendiri. Teddy (clixie), udah punya branch yang lebih stable dan keren. Yang gue tampilin di sini adalah branchnya gue.

<?
 
/*
   Database Library
   * Ver 1.21 2006/11/20 22:10
     - Pindahin tempat dari $this->debug jadi ke atas
     - ganti connected jadi $this->connected
   * Ver 1.2 02/02/2005 4:19PM
     - Perubahan dari fungsi mysql_db_query ke mysql_query, karena fungsi nya sekarang udah
       deprecated
     - Penambahan paramater pada database constructor
     - Penambahan fungsi fetchIntoArray()
   * Ver 1.1 Lupa
     - Penambahan dumpData() dan dumpSQL()
   * Ver 1.0 14/11/2002 9:15PM
     - Yayy.. fungsi db pertama :D
   Author : Frederick Lasmana
   Email  : rickyok at yahoo dot REMOVE THIS com
*/
 
Class Db {
/*
  Ini adalah constructor dari kelas Db, fungsi ini otomatis akan di jalankan
  Semua setting username dan password untuk ke database diletakkan di sini
*/
  function Db($def_server = "", $def_dbName = "", $def_username = "" , $def_password = "") {
    $__userName = "";   // Isi dengan username database
    $__password = "";   // Isi dengan password database
    $__server = "";    // Isi dengan alamat server database, exp : http://www.dbengine.com/
    $__dbName = ""; // Isi dengan nama database, jika lebih dari satu, buat lah dua buah objek Db
 
    // Di sini buat ganti2 warna yang dipake di fungsi dump
    $this->tableOpen = "<table border='0' cellspacing='1' cellpading='1'>";
    $this->tableClose = "</table>\n";
    $this->trOpen = "<tr>";
    $this->trClose = "</tr>\n";
    $this->tdHeadOpen = "<td bgcolor='#CCCCCC'>";
    $this->tdOpen = "<td bgcolor='#CCFFCC'>";
    $this->tdAlternateOpen = "<td bgcolor='#EEFFEE'>";
    $this->tdClose = "</td>\n";
    $this->showHeader = true;
 
    // Jangan edit code dibawah ini ^^
    $this->userName = ($def_username == "")? $__userName : $def_username;
    $this->password = ($def_password == "")? $__password : $def_password;
    $this->server = ($def_server == "")? $__server : $def_server;
    $this->dbName = ($def_dbName == "")? $__dbName : $def_dbName;
    $this->connected = false;
    $this->debug = true;
    $this->connectDb();
 
  }
/*
  Fungsi ini dipanggil dari constructor, jadi ketika class di buat
  langsung di hubungkan dengan database, fungsi ini sebenernya tidak perlu
  dipanggil
  Contoh pembuatan Class : 
  $db = new Db();
*/
  function connectDb() {
    if ($this->handle = mysql_connect($this->server , $this->userName , $this->password)) {
      $this->connected = true;
      return true;
    }
    else {
    	if ($this->debug) $this->errMsg("Host not found : " . $this->server);
      return false;
    }
  }
/*
  Fungsi untuk menutup koneksi ke database, biasanya di letakkan di bagian
  bawah dari halaman, namun fungsi ini tidak harus dipanggil, karena    	
  php otomatis akan menutup koneksi ketika tidak diperlukan lagi
*/
  function closeDb() {
    mysql_close($this->handle);
    $this->connected = false;
  }
 
/*
  Fungsi ini digunakan untuk memasukan query seperti UPDATE, INSERT, DELETE
  dan semua fungsi-fungsi SQL lain nya.
  Parameter :
    $sql : diisi dengan perintah SQL nya
  Contoh :
    $result = $db->query("SELECT * FROM phonebook");
*/
  function query($sql) {
    mysql_select_db($this->dbName, $this->handle);
    if ($result = mysql_query($sql , $this->handle)) {
    	return $result;
    }
    else {
    	if ($this->debug) $this->errMsg("Cannot execute query $sql on database $this->dbName.");
    	return NULL;
    }
  }
/*
  Fungsi ini digunakan untuk mendapatkan nilai per baris dari query yang
  sudah di lakukan dari fungsi di atas. Fungsi ini akan mengembalikan
  result set jika berhasil dan tidak mengembalikkan pesan ERR jika $result = NULL
  Parameter :
    $result : di isi dengan handler yang di dapat dari query($sql)
  Contoh :
    //Untuk mengambil semua data
    while ($row = $db->fetch($result)) {
    	//lakukan sesuatu di sini
    };
    //Untuk mengambil data pertama
    $row = $db->fetch($result);
*/
  function fetch($result) {
  	if ($result != NULL) {
      return mysql_fetch_array($result);
    }
    else {
    	if ($this->debug) $this->errMsg("You've try to fetch an empty result");
    	return NULL;
    }
  }
 
  // Dump all the data with / without header, use result from query as a input
  function dumpData($result) {
  	if ($result == NULL) {
  		if ($this->debug) $this->errMsg("Cannot dump data, data doesn't exist");
  		return false;
  	}
  	// Display header
	  echo $this->tableOpen; // <table>
  	if ($this->showHeader) {
  	  $fieldLen = mysql_num_fields($result);
  	  echo $this->trOpen;    // <tr>
  	  for ($a = 0 ; $a < $fieldLen ; $a++) {
  	  	echo $this->tdHeadOpen . mysql_field_name($result, $a) . $this->tdClose;
  	  }
  	  echo $this->trClose;
  	}
  	// Display data with 2 color, you can modify the code to make 3 color
  	$rowcount = 0;
  	while($row = mysql_fetch_row($result)) {
  		echo $this->trOpen;
  		foreach($row as $value) {
  			if ($rowcount%2) 
  			  echo $this->tdOpen . $value . $this->tdClose;
  			else
  			  echo $this->tdAlternateOpen . $value . $this->tdClose;
  		}
  		echo $this->trClose;
  		$rowcount++;
  		flush();
  	}
  	echo $this->tableClose;
  }
 
/*
  Fungsi ini digunakan untuk mengambil 1 cell paling kiri atas dari hasil
  query
*/
  function getCell($sql) {
    $result = $this->query($sql);
    if ($this->recordCount($result) > 0)
      return mysql_result($result , 0 , 0);
    else
      return NULL;
  }
 
/*
  Fungsi ini digunakan untuk mengambil semua data dalam bentuk array
  Contoh penggunaan :
 
  $datas = $db->fetchIntoArray($result);
  foreach($datas as $data) {
    echo "Datanya adalah {$data['key']}";
  }
*/  
  function fetchIntoArray($result) {
  	if ($result != NULL) {
      $counter = 0;
      while ($row = mysql_fetch_assoc($result)) {
        if ($row) {
          foreach($row as $key => $data) {
            $temp[$counter][$key] = $data;
          }
        }
        $counter++;
      }
      return $temp;
    }
    else {
    	if ($this->debug) $this->errMsg("You've try to fetch an empty result");
    	return NULL;
    }
  }
 
  function dumpCSV($result) {
  	if ($result == NULL) {
  		if ($this->debug) $this->errMsg("Cannot dump data, data doesn't exist");
  		return false;
  	}
  	// Display header
  	if ($this->showHeader) {
  	  $head = array();
  	  $fieldLen = mysql_num_fields($result);
  	  for ($a = 0 ; $a < $fieldLen ; $a++) {
  	  	$head[] = "\"" . mysql_field_name($result, $a) . "\"";
  	  }
  	  echo implode("," , $head);
  	  echo "\n";
  	}
  	while($row = mysql_fetch_row($result)) {
  	  $col = array();
  		foreach($row as $value) {
  			$value = str_replace('"', '""' , $value);
  			$col[] = "\"" . $value . "\"";
  		}
  	  echo implode("," , $col);
  	  echo "\n";
  	  unset($col);
  		flush();
  	}
  }
 
  // Same function as dumpData, this one use SQL statement as an input
  function dumpSQL($sql) {
  	$this->dumpData($this->query($sql));
  }
/*
  Fungsi-fungsi di bawah ini ditujukan untuk membantu mengisi parameter-parameter
  yang diperlukan untuk masuk ke dalam database. Fungsi ini mungkin tidak
  diperlukan karena semua paramter ini sudah di tentukan ketika Db di buat
*/
  function setServer($server) {
    $this->server = $server;
  }
  function setUserName($uname) {
    $this->userName = $uname;
  }
  function setPassword($pass) {
    $this->password = $pass;
  }
  function setDbName($dbName) {
    $this->dbName = $dbName;
  }
  function isConnected() {
    return $this->connected;
  }
  function debugMode() {
  	$this->debug = true;
  }
  function errMsg($msg) {
  	echo "<script>alert(\"$msg\");</script>";
  }
  // Alias for mysql_num_rows()
  function recordCount($result) {
  	return mysql_num_rows($result);
  }
  // Alias for mysql_affected_rows()
  function rowAffect() {
  	return mysql_affected_rows();
  }
}
 
/*
$db = new Db();
// Contoh query sederhana
$result = $db->query("select * from phonebook");
while($row = $db->fetch($result)) {
  echo $row[1] . "<br>";
}
//*/
 
/*
// Contoh Menggunakan fetchIntoArray
$db = new Db();
$result = $db->query("select * from phonebook");
$datas = $db->fetchIntoArray($result);
foreach($datas as $data) {
  echo $data['name'] . "<br>";
}
//*/
 
 
/*
// Contoh dumpData()
$db = new Db();
$result = $db->query("select p.name 'N a m a', p.phone 'te lp' from phonebook p");
$db->dumpData($result);
$db->dbName = "clixie";
$result = $db->query("select * from rag_item");
$db->dumpData($result);
//*/
 
 
?>
Share

web , ,

Install Oracle 10 Xe dengan PHP

January 5th, 2009

Cache your data

January 17th, 2008

Beberapa hari ini, gue diharuskan membuat aplikasi yang support diakses banyak orang dalam saat yang bersamaan. Dengan bertambahnya user akses berarti bertambah juga performance server yang diperlukan. Dalam riset beberapa hari ini, gue menemukan beberapa alternatif yang lumayan untuk mengurangi beban server. Gunakaan cache.

Apa itu cache?

Cache adalah proses membuat data sementara hasil render suata page ke dalam file atau database. Jika ada user lain yang meminta halaman yang sama ke server anda, anda tidak perlu merender lagi halaman tersebut, cukup baca hasil render yang sebelumnya.

Beberapa cara cache

1. memchached
memcached membantu anda untuk menyimpan hasil result dari query database ke dalam suatu server. Sebelum query anda dijalankan, anda akan mengecheck dulu di servernya memcached apakah query ini sebelumnya sudah dilakukan atau belom. Memcached menggunakan sistem hash dengan multiple server, sehingga anda bisa mengurangi sistem database anda menjadi sesedikit mungkin, sehingga bisa mengurangi cost untuk multi server databases.
Pro:
- Dipakai oleh situs2 besar seperti youtube, gamefaqs, dll, anda bisa melihat list lengkapnya di situs aslinya.
- Sangat membantu untuk mengurangi beban database. Menurut manualnya bisa mengurangi 8 koneksi database menjadi 1.
- 1 result hanya tersimpan di satu server, bukan di semua server. Pembagian server dibagi oleh sistem hashing. Jadi kalo anda punya 3 komputer dengan memory 2 giga, anda sama dengan mempunyai cache server dengan memory 6 giga.
- Berfungsi untuk banyak bahasa dan banyak sistem database.
Cons:
- Sangat memakan memory.
- Anda harus merubah semua logic code anda dari yang hanya baca dari database untuk check dulu ke cache baru baca ke database. Setelah baca dari database, anda akan memasukan result tersebut ke cache.

2. Code Igniter’s cache
Saya menggunakan codeigniter sebagai framework php saya. Keuntungan dari menggunakan framework ini adalah CI menyediakan fasilitas cache internal, tanpa load library tambahan. Anda hanya cukup memanggil satu baris ini di manapun code anda berada :

$this->output->cache(n);

dimana n adalah jumlah menit halaman itu ingin anda cache.
Pro:
- Sedikit sekali perubahan yang anda perlukan untuk menjalankan cache.
- Menggunakan sistem hash juga, tentu saja untuk paramater pemanggilan page yang berbeda, CI akan membuat file cache terpisah. /file/a/ tidak sama dengan /file/b/
- Tidak seperti memcache yang memcache result dari database yang masih harus di proses code PHP. CI mengload langsung code HTML yang sudah di render, hasilnya jauh lebih cepat.
Cons:
- Setiap web server mempunya cachenya masing2. Jadi masih akan membebani database walaupun halaman yang sama dipanggil, kalau user menggunakan server web yang berbeda.
- Membebani web server untuk menyimpan file cache.

Masih banyak cara lagi untuk melakukan cache. Kedua cara diatas bisa digabungkan untuk hasil yang lebih maximal lagi. Tetapi sejauh yang saya coba, cache CI sendirian cukup menurunkan beban server banyak. Sehingga jumlah 3 server bisa dikurangi menjadi 1 server saja.

Share

programming , ,

Switch to our mobile site