Tampilkan postingan dengan label php. Tampilkan semua postingan
Tampilkan postingan dengan label php. Tampilkan semua postingan

Rabu, November 19, 2008

Panduan Instalasi modul OCI8 pada PHP5 Ubuntu

Pada tulisan ini saya akan mencoba menerangkan langkah-langkah menginstall modul OCI8 untuk PHP5 sehingga PHP bisa melakukan koneksi ke database Oracle. Pada tulisan saya terdahulu, saya melakukan kompilasi ulang PHP-nya. Cara ini kurang menguntungkan, karena dengan keluarnya versi baru PHP, kita perlu melakukan kompilasi ulang. Dengan menggunakan modul, kita tetap dapat mengupdate PHP dengan versi terbaru, tanpa perlu repot kompilasi ulang setiap saat.

Operating System yang digunakan adalah Ubuntu 8.04 Hardy Heron, tetapi langkah2 ini juga sama untuk versi sebelum maupun sesudahnya. Paling-paling hanya berbeda versi PHP dan OCI8-nya saja.

Persiapan

Berikut ini adalah paket aplikasi dan library yang harus dipersiapkan.

Paket kompilasi

Paket-paket berikut ini dibutuhkan agar kita bisa melakukan kompilasi modul OCI8. Install dengan menggunakan perintah :

sudo apt-get install
checkinstall build-essential gcc re2c

Paket development PHP5

Paket-paket berikut ini adalah paket development PHP5 yang dibutuhkan untuk mengkompile modul-modul PHP5

apt-get install php-pear php5-dev

Oracle Client

Agar kita bisa melakukan koneksi ke database Oracle, dibutuhkan library Oracle Client. Untuk modul OCI8 kita cukup menggunakan instantclient. Download melalui alamat http://www.oracle.com/technology/software/tech/oci/instantclient/index.html

Setelah download selesai, lakukan langkah berikut ini sebagai root:

mkdir -p /opt/oracle/instantclient
cd /opt/oracle/instantclient
unzip instantclient-basic-linux32-<version>.zip
unzip instantclient-sdk-linux32-<version>.zip
echo "/opt/oracle/instantclient"
>> /etc/ld.so.conf.d/oracle.conf
ldconfig
ln -s libclntsh.so.10.1 libclntsh.so
ln -s libocci.so.10.1 libocci.so

Kompilasi dan Instalasi modul OCI8

Setelah paket-paket aplikasi yang kita butuhkan tersedia, sekarang kita akan melakukan kompilasi modul OCI8. Berikut ini langkah-langkah yang akan kita lakukan.

Download modul OCI8

Kita akan mendownload source code modul OCI8. Untuk melakukannya, lakukan perintah berikut ini sebagai root.

mkdir -p /usr/local/src
cd /usr/local/src
pecl download oci8

Ekstrak dan konfigurasi modul

Setelah langkah diatas selesai dilakukan, kita akan mendapatkan file oci8-1.3.3.tgz (versi terbaru mungkin telah tersedia, sehingga sesuaikan nama filenya dengan nama file yang didapat dari langkah diatas). Selanjutnya kita akan mengekstrak file ini dan mengkonfigurasi modul oci8

tar xzf oci8-1.3.3.tgz
cd oci8-1.3.3
phpize5
./configure
--with-oci8=shared,instantclient,/opt/oracle/instantclient

Kompilasi dan Instalasi

Setelah kita mengkonfigurasinya sesuai dengan library instantclient yang ada, sekarang waktunya kita melakukan kompilasi. Jalankan perintah berikut ini;

make
make install

Selesai? Belum juga :) Modul OCI8 sekarang sudah berada di direktori modul PHP5, tetapi PHP5 belum ditambahkan setting agar meload modul tersebut. Kita akan menambahkan setting ini dengan perintah

echo "extension=oci8.so" >
/etc/php5/conf.d/oci8.ini

Selanjutnya silahkan restart server apache httpd, lalu cek dengan phpinfo. Saat ini modul OCI8 seharusnya telah dikenali oleh PHP5 dan muncul di halaman phpinfo. PHP5 siap melakukan koneksi ke database Oracle.

Selamat mencoba.

Sumber tulisan:

http://ubuntuforums.org/showthread.php?t=92528


Minggu, Agustus 31, 2008

Menyimpan file ke dalam database dan menampilkannya di halaman web

Hari ini saya membaca artikel yang sangat menarik di asktom tentang keuntungan dan kerugian menyimpan file ke dalam database. Tom menjawab bahwa dia sampai saat ini tidak menemukan keuntungan menyimpan data dari file diluar database. Tom memaparkan keuntungan-keuntungan yang didapatkan kalau data file disimpan ke dalam database, diantaranya:

  1. data akan dikelola dengan profesional oleh DBMS
  2. data akan ikut di-backup
  3. dapat di-rollback / di-recover bersama data-data lainnya
  4. data ikut terlindungi / aman
  5. scalable
  6. locking
  7. konsistensi data
Membaca pembahasan-pembahasan yang ada disana, saya jadi tertarik untuk mencoba menyimpan file ke dalam database. Kebetulan proyek yang sedang saya kerjakan di kantor memilki permasalahan sinkronisasi file. Ada dua website, gambar diupload di salah satu website, dan ditampilkan di kedua website. Keduanya akan berada di mesin yang terpisah, sehingga saya perlu memikirkan cara sinkronisasi file hasil upload. Jika file yang diupload saya simpan ke database, saya tentu tidak akan memiliki masalah sinkronisasi, karena kedua website dapat mengambil data dari database yang sama.

Saya pun mencoba membuat halaman sederhana untuk upload file yang akan disimpan ke database, dan menampilkan file yang tersimpan di database. Saya menggunakan framework codeigniter dan untuk akses database saya menggunakan adodb. Untuk DBMS sendiri saya menggunakan OracleXE.

Berikut ini potongan struktur tabel, dan potongan kode yang saya buat. Silahkan dipelajari dan dikembangkan lebih lanjut.

Tabel

CREATE TABLE "T_BLOB"
("ID" NUMBER NOT NULL ENABLE,
 "TITLE" VARCHAR2(255 CHAR),
 "FILE_DATA" BLOB,
 "CONTENT_TYPE" VARCHAR2(100 CHAR),
 CONSTRAINT "T_BLOB_PK" PRIMARY KEY ("ID"));

Sequence

CREATE SEQUENCE "SEQ_BLOB" INCREMENT BY 1 START WITH 1;

Package

CREATE OR REPLACE PACKAGE "P_PUBLIC_TYPES" AS
  TYPE theCursor IS REF CURSOR;
END P_Public_Types;
/

CREATE OR REPLACE PACKAGE "PG_BLOB" as

  function get_single(v_id in INTEGER) return p_public_types.theCursor;

  function get_all(v_order in VARCHAR2) return p_public_types.theCursor;

  function add_blob(v_title in VARCHAR2
                    ,v_content_type in VARCHAR2) return INTEGER;

  function delete_blob(v_id in integer) return INTEGER;

end pg_blob;
/

CREATE OR REPLACE PACKAGE BODY "PG_BLOB" as

  function get_single(v_id in INTEGER) return p_public_types.theCursor as
    cc p_public_types.thecursor;
  begin

    open cc for '
    SELECT B.*
    FROM T_BLOB B
    WHERE B.ID = ' || v_id || '
    ';

    return cc;
  end get_single;

  function get_all(v_order in VARCHAR2) return p_public_types.theCursor as
    cc      p_public_types.thecursor;
    orderby VARCHAR2(255);
  begin
 
    if v_order is not null then
      orderby := ' ORDER BY ' || orderby;
    end if;

    open cc for '
    SELECT B.*
    FROM T_BLOB B
    ' || orderby || '
    ';

    return cc;
  end get_all;

  function add_blob(v_title in VARCHAR2
                    ,v_content_type in VARCHAR2) return INTEGER as
    new_id  INTEGER;
  BEGIN
    select SEQ_BLOB.nextval into new_id from dual;

    INSERT INTO T_BLOB (ID, TITLE, FILE_DATA, CONTENT_TYPE)
    VALUES (new_id, v_title, empty_blob(), v_content_type);

    if SQL%ROWCOUNT > 0 then
      return new_id;
    else
      return 0;
    end if;
  end add_blob;

  function delete_blob(v_id in integer) return INTEGER as
  begin

    DELETE FROM T_BLOB
    WHERE ID = v_id;

    return SQL%rowcount;
  end delete_blob;

end pg_blob;
/

Controller function index

function index()
{
  echo '<p><a href="'.site_url('/testblob/add').'">Add new data</a></p>';

  $rs =& $this->adodb->db->ExecuteCursor('begin'
                                        .' :result := pg_blob.get_all(:v_order);'
                                        .'end;'
                                        ,'result'
                                        ,array('v_order' => ''));
  if ($rs && $rs->RecordCount() > 0)
  {
    $this->load->library('table');
    $this->table->set_heading('No'
                            , 'Title'
                            , 'Content-Type'
                            , 'File');
    $i = 1;
    foreach ($rs as $row)
    {
      $this->table->add_row($i++
                          , $row['TITLE']
                          , $row['CONTENT_TYPE']
                          , $row['FILE_DATA'] ?
                              '<a href="'.site_url('/testblob/file/'.$row['ID']).'">Download File</a>'
                            : 'No File');
    }
    echo $this->table->generate();
  }
  else
  {
    echo '<p>No Data yet</p>';
  }
}

Controller function add

function add()
{
  if ($this->input->post('submit'))
  {
    $uploaded = false;
    if ($_FILES['file']['name'] != '')
    {
      //upload image
      $conf_upload['upload_path']    = realpath(BASEPATH.'../').'/tmp/';
      $conf_upload['allowed_types']  = 'gif|jpg|png';
      $conf_upload['encrypt_name']   = true;

      $this->upload->initialize($conf_upload);

      if ( ! $this->upload->do_upload('file'))
      {
        //echo '<p>'.$this->upload->display_errors().'</p>';
      }
      else
      {
        $data_upload = $this->upload->data();
        $uploaded = true;
      }
    }
    //insert data
    $sql = 'declare'
          .'  result integer;'
          .'begin'
          .'  :result := pg_blob.add_blob(:v_title'
                                      .', :v_content_type);'
        .'end;';
    $stmt =& $this->adodb->db->PrepareSP($sql);

    $this->adodb->db->InParameter($stmt, $this->input->post('title'), 'v_title', 255);
    $this->adodb->db->InParameter($stmt, $data_upload['file_type'], 'v_content_type', 255);
    $this->adodb->db->OutParameter($stmt, $result, 'result');

    $this->adodb->db->Execute($stmt);

    if ($result > 0)
    {
      if ($uploaded)
      {
        $this->adodb->db->UpdateBlobFile('T_BLOB', 'FILE_DATA', $data_upload['full_path'], 'ID='.$result, 'BLOB');
        unlink ($data_upload['full_path']);
      }
      redirect('/testblob/index');
    }
  }

  echo form_open_multipart('/testblob/add', array('name' => 'form_add', 'id' => 'form_add'));
  echo '<ol>';
  echo '<li>'.form_label('Title', 'title').form_input('title', $this->input->post('title'), 'id="title"').'</li>';
  echo '<li>'.form_label('File', 'file').form_upload('file', '', 'id="file"').'</li>';
  echo '<li>'.form_submit('submit', 'Add');
  echo '</ol>';
  echo form_close();
}

Controller function file

function file()
{
  $id = intval($this->uri->segment(3));
  if (! $id)
  {
    redirect('/testblob/index');
  }

  $rs =& $this->adodb->db->ExecuteCursor('begin'
                                        .' :result := pg_blob.get_single(:v_id);'
                                        .'end;'
                                        ,'result'
                                        ,array('v_id' => $id));
  if ($rs && $rs->RecordCount() > 0)
  {
    if ($rs->fields['FILE_DATA'])
    {
      header('Content-type: '.$rs->fields['CONTENT_TYPE']);
      echo $rs->fields['FILE_DATA'];
    }
    else
    {
      echo '<p>No File</p>';
    }
  }
  else
  {
    echo '<p>Data no longer exist</p>';
  }
}

Semoga tulisan singkat ini dapat memberikan gambaran kepada pembaca yang ingin menyimpan file ke dalam database dan menampilkan data file dari database.

Silahkan juga baca pembahasan dan contoh di link berikut ini:

  1. http://www.devarticles.com/c/a/MySQL/Blobbing-Data-With-PHP-and-MySQL/

  2. http://phplens.com/lens/adodb/docs-oracle.htm

  3. http://forums.oracle.com/forums/thread.jspa?threadID=205149

Penjumlahan jam dan menit di PHP

Beberapa jam yang lalu seorang teman bertanya tentang kode PHP untuk menjumlahkan dua string jam dan menit. Saya coba cari di google tapi tidak ada solusi yang saya temukan. Saya pun menyarankan untuk parsing manual stringnya, di-explode dan dijumlahkan secara terpisah menit dan jamnya. Cara dasar tapi memang bisa dipakai untuk menyelesaikan permasalahan.

Beberapa saat yang lalu tiba-tiba saja terlintas ide untuk menggali lagi kehebatan fungsi strtotime yang ada pada PHP. Hasilnya adalah potongan kode berikut ini

<?php

$time1 = '10:20';
$time2 = '12:40';

$time1_unix = strtotime(date('Y-m-d').' '.$time1.':00');
$time2_unix = strtotime(date('Y-m-d').' '.$time2.':00');

$begin_day_unix = strtotime(date('Y-m-d').' 00:00:00');

$jumlah_time = date('H:i', ($time1_unix + ($time2_unix - $begin_day_unix)));



Dengan kode diatas penjumlahan dua string jam:menit dapat dilakukan dengan mudah. Semoga bermanfaat.


Update: kesalahan ketik diatas sudah diperbaiki :) Maklum ditulisnya malem2 sih...

Kamis, April 17, 2008

Kompilasi dan instalasi modul ffmpeg-php di Ubuntu

Tahun lalu sewaktu saya membutuhkan module oracle untuk PHP, saya perlu melakukan kompilasi php sendiri dari source code saat itu. Proses kompilasi, selain lama, juga perlu diulang setiap kali versi/rilis baru php keluar. Hal ini tentunya tidak praktis untuk dilakukan.

Saat ini ternyata kompilasi php tidak perlu lagi dilakukan sendiri. Saya dapat mengkompile sendiri modul php yang saya butuhkan, untuk kemudian tinggal diload melalui php.ini. Kompilasi modul sangatlah sebentar, karena ukurannya yang memang kecil. Selain waktu kompilasi yang cepat, jika versi baru php dirilis, saya juga tidak perlu melakukan kompilasi ulang, selama modul masih kompatibel dengan versi php tersebut.

Berikut ini saya akan menuliskan langkah-langkah instalasi modul ffmpeg-php. Langkah-langkah ini adalah hasil rangkuman dari panduan di situs ini dan ini, dan saya sesuaikan dengan kondisi saat saya melakukan kompilasi dan instalasi.

Langkah pertama, persiapan



Siapkan ubuntu untuk melakukan kompilasi. Ada beberapa paket development yang perlu diinstall yaitu:
Paket php development:

$ sudo apt-get install php5-dev

paket ffmpeg saran dari goose blog:

$ sudo apt-get install ffmpeg libavformat-dev libavcodec1d libavformat1d

paket ffmpeg saran dari escapegoat.org:

$ sudo apt-get install liblame-dev libfaad2-dev libfaac-dev libxvidcore4-dev liba52-0.7.4 liba52-0.7.4-dev libx264-dev libdts-dev libgsm1-dev libvorbis-dev libdc1394-13-dev checkinstall build-essential gcc


Langkah kedua, download



Untuk langkah ini dan seterusnya, saya mengikuti panduan dari goose blog. Jika Anda ingin mengikuti panduan dari escapegoat.org silahkan saja dicoba :)

Download source code ffmpeg-php dari sourceforge.net. Saat saya melakukan ini, alamatnya adalah :
http://downloads.sourceforge.net/ffmpeg-php/ffmpeg-php-0.5.2.1.tbz2?modtime=1207482494&big_mirror=0

Langkah ketiga, kompilasi



Lakukan ekstrak terhadap file ffmpeg-php-0.5.2.1.tbz2 dengan perintah :

$ tar jxvf ffmpeg-php-0.5.2.1.tbz2


Setelah itu, masuklah ke direktori ffmpeg-php-0.5.2.1 hasil ekstraksi dengan perintah:

$ cd ffmpeg-php-0.5.2.1


dan lakukan perintah berikut ini untuk mengkompile modul ffmpeg-php :

$ phpize5
$ ./configure
$ make
$ sudo make install


Perintah-perintah diatas akan mempersiapkan source code ffmpeg-php, mengkompile-nya, dan menginstallnya di direktori modul php. Lokasi modul php akan terlihat saat perintah terakhir dijalankan. Ini hasil pada sistem yang saya gunakan:

$ sudo make install
Installing shared extensions: /usr/lib/php5/20060613+lfs/


Langkah keempat, konfigurasi php.ini



Setelah modul selesai dikompile dan diinstall, sekarang kita perlu menambahkannya pada php.ini, agar modul dikenali dan diload oleh php. Saran dari escapegoat.org maupun dari goose blog adalah mengedit file php.ini, tetapi saya tidak setuju dengan ini. Ada mekanisme yang lebih mudah daripada harus mengedit file php.ini.

Saya tidak tahu sejak kapan fitur loading konfigurasi secara dinamis ada, tetapi Debian yang saya gunakan tahun lalu sudah memiliki fitur ini. Saya juga tidak tahu nama resminya apa. Konfigurasi apache dan php di ubuntu maupun debian bukan 1 file lagi, tetapi sudah dipecah-pecah menjadi file-file kecil yang dapat diload secara otomatis ketika server dihidupkan. Fitur ini memudahkan kita menambahkan konfigurasi kustom dan tidak perlu takut konfigurasi kita ditimpa saat melakukan upgrade.

Folder konfigurasi dinamis php.ini ada di /etc/php5/conf.d. Di direktori ini telah ada banyak file-file .ini, masing-masing meload modul sesuai dengan nama filenya. Untuk menambahkan modul ffmpeg-php hasil kompilasi kita tadi, kita cukup membuat file ffmpeg.ini di direktori ini dan isikan konfigurasi berikut ini:

# configuration for ffmpeg-php module
extension=ffmpeg.so


Langkah kelima, restart apache



Sekarang tiba saatnya kita menguji dan menggunakan modul ffmpeg-php. Restart apache dengan perintah :

$ sudo /etc/init.d/apache2 restart


Buka halaman php yang memanggil fungsi phpinfo(); menggunakan browser. Jika instalasi ffmpeg-php sukses, maka modul ffmpeg-php akan tampil di halaman phpinfo ini dan modul ini siap untuk digunakan.

Selamat menginstall dan menggunakan ffmpeg-php