Upgrade aplikasi web PHP dengan minimum downtime menggunakan Oracle Editioning


Pendahuluan

Para Edition-Based Redefinition (EBR) fitur Oracle Database 11gR2 sangat ideal untuk situs web yang bertujuan untuk tidak downtime saat aplikasi merilis perangkat tambahannya. Editioning memungkinkan objek database tertentu untuk memiliki beberapa versi yang tersedia pada waktu yang sama. Aplikasi dapat memutuskan pada saat runtime versi dari obyek harus digunakan.

Dalam contoh ini akan menunjukkan bagaimana editioning Oracle dapat digunakan untuk meng-upgrade sebuah “live” aplikasi PHP. Perubahan dapat dibuat dan diuji pada database produksi dan kemudian diaktifkan untuk semua pengguna dengan satu kata kunci perubahan ke aplikasi.
Objek yang dapat editioned oleh Oracle adalah:

  • Synonyms
  • Views
  • PL/SQL object types:
    • Function
    • Library
    • Package and package body
    • Procedure
    • Trigger
    • Type and type body

Tabel sendiri tidak dapat diedisikan, tetapi ada dukungan untuk bergerak dan melihat data melalui edisi.

Aplikasi PHP awal

Untuk memulai contoh, jalankan SQL * Plus sebagai user edisi SISTEM dan memberikan akses kepada pengguna aplikasi CJ:
sqlplus system/systempassword
grant create any edition to cj;
alter user cj enable editions;

Sebagai user CJ buat tabel employees untuk aplikasi:
sqlplus cj/cj
drop table myemp;
create table myemp(name varchar2(10), hoursworked number);
insert into myemp(name,hoursworked) values('alison',200);
insert into myemp(name,hoursworked) values('kris',200);
insert into myemp(name,hoursworked) values('wenji',200);
commit;

Sekarang menciptakan fungsi yang disimpan yang menghitung jumlah hari liburan seorang karyawan yang memenuhi syarat untuk. Fungsi ini disimpan dalam database Oracle sehingga semua aplikasi dapat menggunakan kembali logika yang sama:
create or replace function
vacationdaysleft(p_name in varchar2)
return number as vdl number;
begin
-- For every 40 hours worked, you get 1 day of vacation
select floor(hoursworked / 40) into vdl
from myemp
where myemp.name = p_name;
return vdl;
end;
/

Tes fungsi di SQL * Plus dengan calling:
select name, vacationdaysleft(name) from myemp;
Returns:
NAME VACATIONDAYSLEFT(NAME)
------------------------- ----------------------
alison 5
kris 5
wenji 5

dengan Oci8 1,3 PHP fungsi tersebut dapat digunakan dalam sebuah file contoh, vacation.php:
<?php
$c = oci_connect('cj','cj','localhost/orcl');
$s = oci_parse($c,'alter session set edition = ora$base');
ci_execute($s);
$s = oci_parse($c,"begin :vdl :=vacationdaysleft(:name);end;");
oci_bind_by_name($s, ":vdl", $vdl, 10);
oci_bind_by_name($s, ":name", $name, 10);
$name = 'alison';
oci_execute($s);
echo "$name has ".$vdl." days vacation left" . PHP_EOL;
?>

Sederhana ini membuat panggilan ke fungsi dan kembali disimpan di $ vdl jumlah hari liburan untuk orang $ name.

Perhatikan ALTER SESSION panggilan. Saya telah menambahkan itu karena tahu akan menggunakan fitur editioning.  ‘ora $ base’ token berarti untuk menggunakan root atau objek edisi pertama, yaitu PL / SQL fungsi vacationdaysleft () kita baru saja dibuat. Pernyataan yang ALTER akan muncul cukup banyak segera setelah koneksi dibuat – Anda tidak ingin bagian dari aplikasi yang akan menggunakan edisi yang salah.

Script PHP menghasilkan output seperti:
$ php vacation.php
alison has 5 days vacation left

Ini bagus. Kami memasukkan aplikasi ke dalam produksi dan karyawan mulai menggunakannya. Semuanya baik untuk sementara waktu.

Mengupgrade Aplikasi

Sekarang asumsikan tingkat liburan digunakan untuk menghitung jam perlu diubah sehingga sekarang untuk setiap 30 jam kerja, karyawan mendapat satu hari libur. Serta kita ingin menyertakan perhitungan berapa hari liburan mereka sudah diambil.

Pertama, kita perlu sebuah kolom baru untuk menyimpan liburan mereka telah diambil. Menambah kolom ini tidak akan mempengaruhi menjalankan aplikasi PHP karena tidak tahu tentang hal ini (ini adalah pengingat yang baik untuk tidak melakukannya “select *” dalam suatu aplikasi ). Kolom baru adalah:
alter table myemp add daysvacationtaken number;
Kita perlu mengisi kolom tersebut secara manual:
update myemp set daysvacationtaken=2 where name='alison';
update myemp set daysvacationtaken=3 where name='kris';
update myemp set daysvacationtaken=0 where name='wenji';
commit;

Untuk skenario yang lebih kompleks fitur editioning CROSSEDITION Trigger dan editioning View untuk membantu memastikan data yang sesuai tersedia dan digunakan secara benar dalam edisi lama dan baru dari aplikasi. Ingat fungsi PL / SQL sekarang dan masa depan yang telah ditingkatkan versinya dapat mengakses tabel yang sama secara bersamaan – hanya kode PL / SQL yang  memiliki beberapa versi.

Sekarang kita perlu menciptakan versi baru dari PL / SQL fungsi. Di SQL * Plus menciptakan sebuah edisi baru dan mengaturnya untuk dapat digunakan untuk sesi ini:

sqlplus cj/cj
create edition e2;
alter session set edition = e2;

Sekarang membuat versi terbaru dari prosedur. Karena SQL * Plus sesi dalam edisi ‘e2’ ini tidak akan mempengaruhi aplikasi PHP yang dijalankan menggunakan edisi ‘ora $ base’. Fungsi yang disempurnakan yang dapat dibuat dengan:

create or replace function
vacationdaysleft(p_name in varchar2) return number as
vdl number;begin
-- For every 30 hours worked, you get 1 day of vacation
select floor(hoursworked / 30) - daysvacationtaken into vdl
from myemp
where myemp.name = p_name;
return vdl;
end;
/

Query ini menunjukkan nilai-nilai yang telah diperbarui:
select name, vacationdaysleft(name) from myemp;
NAME VACATIONDAYSLEFT(NAME)
------------------------ ----------------------
alison 4
kris 3
wenji 6

Ini semua dilakukan sedangkan pengguna terus menggunakan aplikasi PHP live dan mendapatkan hasil yang asli. Anda dapat memeriksa bahwa script masih mengembalikan nilai “lama” :

$ php vacation.php
alison has 5 days vacation left

Sekarang edit vacation.php dan rubah statement ALTER SESSION ke edisi baru:
$s = oci_parse($c, 'alter session set edition = e2');
Ketika berjalan, skrip keluaran sekarang menunjukkan calcuation diperbarui dari waktu liburan:
$ php vacation.php
alison has 4 days vacation left

Anda dapat melihat bahwa gulungan update dari aplikasi dapat dibuat lebih cepat dan pengujian lebih teliti, meningkatkan ketersediaan dan keandalan situs web.

Kesimpulan

Oracle Database 11g Release 2 Editioning membantu situs web PHP memenuhi tujuan minimal downtime dengan siklus upgrade yang sering dibutuhkan oleh aplikasi web modern. Hal ini memungkinkan aplikasi PHP, seringkali mereka disimpan dengan kompleksitas logika bisnis, dan kumpulan data besar siap diperbarui tanpa mempengaruhi pengoperasian pengguna yang ada.

Setelah menyiapkan edisi objek, proses sederhana rolling script PHP baru dengan nama edisi diperbarui untuk upgrade aplikasi memungkinkan terjadi dengan cepat.

Oracle manual memiliki informasi lebih lanjut tentang penggunaan dan mengelola edisi.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s