Test Block Top

The Blog...
Articles, Tips & Trick and Other Interesting Information...
13 Mei 2012

Optimize MySQL (Fix Overhead Table)

Kecepatan akses load website atau blog anda menurun? Bisa jadi itu karena terlalu banyak plugin, addon, script, embed gambar yang terlalu banyak atau traffic web server sedang ramai. Namun faktor-faktor tersebut tidak selalu menjadi penyebab load situs menurun.

Database yang kurang terpelihara bisa juga menjadi penyebab load website/blog lambat. Membengkaknya ukuran file database selalu berbanding lurus dengan penambahan data pada website/blog, baik itu penambahan konten (content), plugin, komentar (comment) atau jenis penambahan data lainnya. Seiring dengan penambahan data-data ini, database menjadi terfragmentasi (konsepnya identik dengan fragment pada hard disk PC). Akibatnya koneksi request data antara browser client dengan database memakan waktu lebih lama. Ini yang menyebabkan data pada disk menjadi Overhead.

Dari uraian di atas, sederhananya begini; ibarat ratusan atau ribuan buku diperpustakaan yang tidak dikelompokkan (campur aduk), akan memakan waktu lama untuk mencari buku matematika misalnya diantara jenis buku lainnya (Fisika, Kimia, Bahasa, Sejarah, dlsb) yang amburadul/semrawut (tidak tertata). Namun akan lebih efisien jika buku-buku tersebut dikelompokkan berdasarkan jenisnya dan menyisihkan buku-buku yang sudah usang, waktu pencarian buku akan menjadi lebih cepat.

Bagi anda yang merasa akses kecepatan website/blog nya menurun, tips optimize overhead table database berikut ini bisa anda terapkan.

  1. Pertama-tama, pastikan anda sudah buat backup database & website/blog jika memungkinkan ganti ke mode maintenance atau pilih waktu optimize ketika traffic website/blog tidak terlalu ramai.
  2. Login ke halaman phpMyAdmin via cPanel atau custom directory (http://domain-anda.com/phpmyadmin misalnya) jika anda install phpMyAdmin terpisah (tidak bundle dengan cPanel) pada server VPS / dedicated server.
  3. Klik pada database yang ingin dioptimize, kemudian anda akan melihat daftar table (table paling kiri) dan overhead table (table paling kanan). Lihat screenshot di bawah.
    Optimize Overhead Table

    Optimize Overhead Table

  4. Klik pada overhead table, kemudian klik Optimize table (Screenshot lihat di bawah).
    Optimize Overhead Table 2

    Optimize Overhead Table 2

  5. Jika optimize berhasil, anda akan melihat pesan konfirmasi Optimize Table sukses.

    Success Message:

    Your SQL query has been executed successfully

    OPTIMIZE TABLE 'wp_yarpp_related_cache'

    Optimize Overhead Table 3

    Optimize Overhead Table 3

  6. Ulangi langkah ke-3 & 4 untuk optimize table lainnya sampai tidak ada lagi table overhead.
Optimize overhead table database sampai di sini selesai.

Tambahan:

Ketika user hapus item data pada interface admin maupun client area, row pada table database tidak sepenuhnya terhapus (hanya hapus data query). Identik dengan keranjang sampah (recycle bin) pada komputer PC, komputer atau server akan tetap menyaring (identifikasi) data baik itu data kosong maupun data aktual. Proses identifikasi inilah yang menentukan lama tidaknya query browser client ke database. Jika database terlalu besar imbasnya kecepatan akses load website/blog menjadi lebih lambat.

Ilustrasi pada sample artikel ini, plugin WordPress Download Monitor sudah tidak saya gunakan lagi + sudah terhapus dari daftar plugin & disk (ruang penyimpanan). Namun tidak pada table database MySQL (Lihat Screenshot di bawah). Untuk lebih mengoptimalkan database MySQL, anda dapat meminimalkan identifikasi data dengan menghapus table-table sampah yang sudah tidak terpakai. Klik pada link Drop table yang ingin dihapus satu per satu, atau klik pada checkbox sebelah kiri table untuk hapus beberapa tabel sekaligus → kemudian pada dropdown menu pilih Drop (Lihat Screenshot di bawah).
DROP Junk Table

DROP Junk Table

Pada pensan konfirmasi DROP TABLE → klik tombol Yes

Do you really want to :

DROP TABLE 'wp_download_monitor_files', 'wp_download_monitor_file_meta', 'wp_download_monitor_formats', 'wp_download_monitor_log', 'wp_download_monitor_relationships', 'wp_download_monitor_stats', 'wp_download_monitor_taxonomies';
Drop Table Confirm

Drop Table Confirm

Your SQL query has been executed successfully

DROP TABLE 'wp_download_monitor_files',
'wp_download_monitor_file_meta',
'wp_download_monitor_formats',
'wp_download_monitor_log',
'wp_download_monitor_relationships',
'wp_download_monitor_stats',
'wp_download_monitor_taxonomies';


Table Dropped

Table Dropped

Selesai.

Tips:

Lakukan pengecekan overhead table & table sampah (junk table) setidak-tidaknya satu bulan sekali untuk menghindari table crash.

Semoga bermanfaat...
:)

Sekilas Tentang Robots.txt

Dilihat dari nama ekstensi filenya .txt (text), dapat dimpulkan robots.txt merupakan file text dalam konteks artikel ini mempunyai arti file text yang dibuat khusus untuk memberitahukan robot mesin pencari (search engine) tentang apa yang harus mereka lakukan pada halaman tertentu website atau blog. Singkatnya robots.txt dikhususkan untuk membatasi aktifitas crawling search engine terhadap file ataupun direktori folder tertentu suatu website/blog.

Untuk membuat file robots.txt caranya gampang, buat file baru menggunakan text editor (notepad misalnya) dan simpan dengan nama robots.txt. Kemudian upload file ini ke direktori root website (public_html, htdocs, dlsb).

Contoh Penggunaan Syntax robots.txt

Blok Semua Robot ke Semua File/Direktori



# Blok Semua Robot ke Semua File/Direktori
User-agent: *
Disallow:

Blok Semua Robot



# Blok Semua Robot
User-agent: *
Disallow: /

Blok Semua Robot Pada Direktori/Folder Tertentu



# Blok Semua Robot Pada Direktori/Folder Tertentu
User-agent: *
Disallow: /admin/
Disallow: /member/
Disallow: /private/

Blok Spam Bots



# Blok Spam Bots
User-agent: Bad Crawler
Disallow: /

Seperti terlihat pada contoh di atas, anda bisa menyisipkan comment (komentar) pada file robots.txt untuk memudahkan identifikasi syntax. Tambahkan karakter #, kemudian tulis komentar anda.

Namun seperti layaknya karya buatan manusia lainnya, robots.txt mempunyai beberapa kelemahan, diantaranya:
  1. robots.txt tidak akan mampu blok spam bots (bad crawler/robot), biasanya spam bots mengabaikan syntax rule robots.txt.
  2. robots.txt ditujukan hanya untuk blok robot (search engine) & bukan user (site visitor).

    robots.txt merupakan public file, semua orang (site visitor) bisa melihat konfigurasi file atau direktori mana saja yang diblok oleh file robots.txt. Cukup dengan mengetikkan alamat domain atau subdomain diikuti dengan mengetikkan karakter garis miring/slash (/) + robots.txt, site visitor bisa melihat isi/konten file robots.txt (http://domain-target.com/robots.txt)

    Untuk mencegah pengunjung situs (site visitor) melihat file robots.txt, baca trik .htaccess di sini.
Tips menggunakan file robots.txt:
  1. Selalu tempatkan file robots.txt pada direktori/folder root website (baik domain utama maupun subdomain). Contoh: tempatkan pada http://domainmu.com, http://subdomain1.domainmu.com, http://subdomain2.domainmu.com, dst...
  2. Tak ada manusia yang sempurna. Tidak menutup kemungkinan penulisan code (syntax) pada file robots.txt bisa salah ketik. Gunakan tool online checker robots.txt untuk cek file robots.txt anda. Berikut beberapa situs robots.txt checker yang dapat anda kunjungi:
  3. Manfaatkan robots.txt generator pada halaman Google Webmaster Tools untuk buat file robots.txt.
  4. Untuk blok robot tertentu, info database robot bisa anda lihat pada halaman ini.
Semoga bermanfaat...
:)

Cegah Akses File robot.txt Kecuali Google

File robots.txt dikhususkan hanya untuk blok robot (search engine) & bukan user (site visitor). Karena file robots.txt merupakan public file, semua orang (site visitor) bisa melihat konfigurasi file atau direktori mana saja yang diblok oleh file robots.txt.

Cukup dengan mengetikkan alamat domain atau subdomain diikuti dengan mengetikkan karakter garis miring/slash (/) + robots.txt, site visitor bisa melihat isi/konten file robots.txt (http://domain-target.com/robots.txt) (Gambar lihat Screenshot di bawah).
Cegah Akses File robots.txt

robots.txt

Untuk menghindari visitor akses file robots.txt, berikut ada cara menyembunyikan (deny access) file robot.txt dari scanning luar kecuali untuk googlebot dan google analytics:

Buka file .htaccess, kemudian tambahkan code di bawah ini:



<Files robots.txt>
Order Deny,Allow
Deny from All
Allow from googlebot.com google.com google-analytics.com
</Files>

Simpan perubahan file .htaccess. Sekarang setiap kali ada visitor yang akses file robots.txt, akan diarahkan ke halaman error 403 (forbidden).

Forbidden

You don't have permission to access /robots.txt on this server.
Cegah Akses File robots.txt 2

robots.txt: Forbidden Error 403

Selesai. Semoga bermanfaat...
:)
11 Mei 2012

Repair 'wp_posts' Crashed Database WordPress

Beberapa saat yang lalu, kaget ketika login pada situs WordPress milik saya. Posting, page, comment, custome menu semuanya HILANG begitu saja.
WordPress Table Database Crashed wp_posts

Screenshot 1

WordPress Table Database Crashed wp_posts 3

Screenshot 2

Sempat terlintas dibenak, mungkin situsku kena hack!!! Hehe... nggak mau buru-buru ambil kesimpulan, coba cek dulu database di Webmin. Ternyata oh... ternyata..., table wp_post crashed dengan pesan error:

Error Message:

SQL show index from 'wp_posts' failed:Table './wordpress/wp_posts' is marked as crashed and should be repaired
WordPress Database Table Crashed wp_posts 1

Screenshot 3

Begitu juga pada halaman phpMyAdmin yang manampakkan pesan error serupa:

Error Message:

#145 - Table './wordpress/wp_posts' is marked as crashed and should be repaired
WordPress Database Table Crashed Error wp_posts 4

Screenshot 4

Bagi anda yang mempunyai masalah serupa dengan saya, jangan panik!! Berikut cara repair database table error (wp_posts) WordPress. Pertama login pada halaman phpMyAdmin, kemudian klik pada database WordPress anda → centang checkbox wp_posts → pada dropdown menu pilih Repair table → kemudian klik tombol Go (Screenshot lihat pada gambar di bawah).
WordPress Database Table Crashed wp_posts 5

Screenshot 5

Jika repair berhasil, anda akan menerima pesan konfirmasi sukses yang bertuliskan (Gambar; lihat pada screenshot di bawah):

Success Message:

Your SQL query has been executed successfully
REPAIR TABLE 'wp_posts'
Table 'wordpress.wp_posts', Operation 'repair', Message type 'status', Message 'OK'

WordPress Database Table Crashed wp_posts 6

Screenshot 6

Sampai di sini situs WordPress sudah kembali seperti semula (normal). Posting, page, comment, custome menu dan elemen-elemen lainnya yang hilang akan kembali muncul.

Untuk menghindari kejadian serupa pada situs WordPress anda dilain waktu, berikut ada sedikit tips yang bisa anda terapkan:
  1. Backup database WordPress secara berkala baik itu menggunakan plugin WordPress database backup atau langsung via halaman interface phpMyAdmin.
  2. Optimalkan Database MySQL. Cek overhead table & lakukan table optimizing pada halaman phpMyAdmin setidak-tidaknya sebulan sekali.
  3. Sedia payung sebelum hujan. Lakukan full website backup, tidak menutup kemungkinan error atau gangguan lain pada server bisa menimpa account-account anda yang lain (email, addon domain, subdomain, dlsb) kapan & dimana saja. Jika control panel website anda menggunakan cPanel, lakukan full website backup pada halaman interface cPanel.
Selesai. Semoga bermanfaat.
:)

Disable Auto Login SSL cPanel/WHM Server

Otomatis login menggunakan alamat SSL (https://) → port 2087; pada cPanel/WHM biasanya terjadi setelah ioncube PHP Loader baru saja di install pada server. Berikut cara men-disable SSL login ketika akan akses halaman cPanel/WHM:

» Login ke WHM → Untrusted security certificate, klik I Understand the RisksAdd Exception...

» Add Security Exception centang Permanently store this exception → klik tombol Confirm Security Exception

Login ke WHM sebagai root user.
Untrusted security certificate

Untrusted security certificate

Add Security Exception

Add Security Exception

WHM Login

WHM Login

WHMserver configurationtweak settingSecurityRequire SSL [?] → setting ke off → Klik tombol save (lihat Screenshot di bawah).
cPanel/WHM: Disable Auto Login

cPanel/WHM: Disable Auto Login

Save Setting

Save Setting

Logout WHM & login menggunakan port standar WHM (2086)

Selesai. Semoga bermanfaat...
:)
10 Mei 2012

Cegah Hotlinking Via .htaccess

Pertanyaan: Bagaimana cara mencegah orang linking gambar atau video dari situs saya menggunakan file .htaccess?

Yang dimaksud Hotlinking di sini berarti suatu tindakan seseorang yang melinking objek non-HTML dari satu situs asal ke situs lain pada server yang berbeda, dengan subjek linking antara lain file gambar, video dan lain sebagainya. Dampak langsung dari hotlink ini akan akan terlihat pada melonjaknya pemakaian bandwidth anda. Anda dapat mencegah tindakan hotlinking ini dengan cara menggunakan file ".htaccess".

Jika anda sebelumnya sudah mempunyai file ".htaccess", maka cukup dengan menyisipkan kode di bawah pada file ".htaccess" yang sudah ada. Jika belum, buatlah file ".htaccess" baru menggunakan kode di bawah, kemudian upload ke direktori atau sub direktori webserver anda jika menginginkan pencegahan hotlinking ini diterapkan pada folder yang berlainan.

Peringatan:


.htaccess merupakan file konfigurasi yang sangat berpengaruh terhadap accessible suatu website. Meskipun mungkin anda secara tidak sengaja melupakan hal yang sepele (lupa menambahkan spasi misalnya) dapat menyebabkan halaman website tidak akan terbuka (berfungsi) sebagian atau keseluruhan.
Khusus untuk pengguna OS Windows yang ingin membuat file ".htaccess" baru, langkah pertama buatlah file text kosong menggunakan software text editor (notepad misalnya), kemudian simpan dengan nama htaccess.txt. Setelah selesai & semua command (perintah) sudah ditulis dengan benar, upload ke webserver anda. Jangan lupa rename file "htaccess.txt" menjadi ".htaccess".

Peringatan:


Alasan mengapa anda harus menyimpan file tersebut dengan nama "htaccess.txt" adalah karena sebagian besar sistem operasi dan program FTP secara default tidak dapat mengenali (membaca) file ".htaccess". Setelah file "htaccess.txt" berhasil diupload ke webserver, rename file "htaccess.txt" menjadi ".htaccess".
Gunakan command di bawah ini untuk mencegah hotlinking ke situs anda:

Ganti text linggihnote.blogspot.com pada baris ke tiga dengan nama domain anda:



RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?linggihnote.blogspot.com/.*$ [NC]
RewriteRule \.(gif|jpg|jpeg|bmp|zip|rar|mp3|flv|swf|xml|php|png|css|pdf)$ - [F]

Menampilkan konten peringatan jika orang terdeteksi melakukan hotlinking ke situs anda.

Anda dapat menampilkan konten peringatan yang akan ditampilkan pada situs orang yang melakukan hotlinking jika tindakan hotlinking ini terdeteksi. Umumnya hal ini dilakukan dengan menampilkan gambar berisi tulisan peringatan "Dilarang Hotlinking", menampilkan gambar orang marah dan lain sebagainya. Caranya dengan menyisipkan kode di bawah ini (Ganti text linggihnote.blogspot.com pada baris 3 dan 4 dengan nama domain anda):



RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?linggihnote.blogspot.com/.*$ [NC]
RewriteRule \.(gif|jpg)$ http://www.linggihnote.blogspot.com/dilaranghotlinking.gif [R,L]

Selesai. Semoga bermanfaat.
:)
06 Mei 2012

PHP To JavaScript Converter

Tidak sengaja saya baru saja menemukan script unik di google code, script PHP yang dapat convert File PHP ke JavaScript. Penasaran! Langsung saja ke TKP. Berikut cara sederhana convert file PHP ke JavaScript.

Pertama, persyaratan untuk dapat menjalankan script PHP to JavaScript Converter ini adalah Webserver (Setidaknya Apache Webserver harus terinstall di server). Jika anda punya account hosting, anda bisa langsung melanjutkan tutorial ini. Namun jika tidak ada, tidak masalah. Script ini bisa juga dijalankan oleh Apache yang terinstall pada sistem operasi Windows (menggunakan WAMP Server).

Kedua, code simple PHP to JavaScript Converter. Copy code PHP di bawah ini kemudian simpan dengan nama terserah (bebas). Misal, php2js.php:



<?php
error_reporting(E_ALL);
class PHP2js {
/** @var array holds tokens of the php file being converted */
private $_tokens;
/** @var int number of tokens */
private $count;
/** @var int the current token */
private $current = 0;
/** @var javascript gets collected here */
private $js;

/** @var array these token keys will be converted to their values */
private $_convert = array (
'T_IS_EQUAL'=>'==',
'T_IS_GREATER_OR_EQUAL'=>'>=',
'T_IS_SMALLER_OR_EQUAL'=>'<=',
'T_IS_IDENTICAL'=>'===',
'T_IS_NOT_EQUAL'=>'!=',
'T_IS_NOT_IDENTICAL'=>'!==',
'T_IS_SMALLER_OR_EQUA'=>'<=',
'T_BOOLEAN_AND'=>'&&',
'T_BOOLEAN_OR'=>'||',
'T_CONCAT_EQUAL'=>'+= ',
'T_DIV_EQUAL'=>'/=',
'T_DOUBLE_COLON'=>'.',
'T_INC'=>'++',
'T_MINUS_EQUAL'=>'-=',
'T_MOD_EQUAL'=>'%=',
'T_MUL_EQUAL'=>'*=',
'T_OBJECT_OPERATOR'=>'.',
'T_OR_EQUAL'=>'|=',
'T_PLUS_EQUAL'=>'+=',
'T_SL'=>'<<',
'T_SL_EQUAL'=>'<<=',
'T_SR'=>'>>',
'T_SR_EQUAL'=>'>>=',
'T_START_HEREDOC'=>'<<<',
'T_XOR_EQUAL'=>'^=',
'T_NEW'=>'new',
'T_ELSE'=>'else',
'.'=>'+',
'T_IF'=>'if',
'T_RETURN'=>'return',
'T_AS'=>'in',
'T_WHILE'=>'while',
'T_LOGICAL_AND' => 'AND',
'T_LOGICAL_OR' => 'OR',
'T_LOGICAL_XOR' => 'XOR',
'T_EVAL' => 'eval',
'T_ELSEIF' => 'else if',
'T_BREAK' => 'break',
'T_DOUBLE_ARROW' => ':',
);

/** @var array these tokens stays the same */
private $_keep = array(
'=', ',', '}', '{', ';', '(', ')', '*', '/', '+', '-', '>', '<', '[', ']',
);

/** @var array these tokens keeps their value */
private $_keepValue = array (
'T_CONSTANT_ENCAPSED_STRING', 'T_STRING', 'T_COMMENT', 'T_ML_COMMENT', 'T_DOC_COMMENT', 'T_LNUMBER',
'T_WHITESPACE',
);

/**
* constructor, runs the show
*
* @param string $file path (relative or absolute) to the php file that is converted to js
*/
public function __construct ($file) {
$this->file = $file;
$this->_tokens = $this->getTokens($file);
$this->count = count($this->_tokens)-1;
$this->compileJs();

}

/**
* gets tokens from file. Remove the meta PHP2js stuff.
*
* @param string $file path (relative or absolute) to the php file that is converted to js
* @return array
*/
private function getTokens($file) {
$src = file_get_contents($this->file);
$src = preg_replace ("/\n([\t ]*)require.*PHP2js\.php.*\'.*;/Uis", "", $src);
$src = preg_replace ("/\n([\t ]*)new.*PHP2js.*;/Uis", "", $src);
$this->src = $src;
return token_get_all($src);
}

/**
* loops through tokens and convert to js
*
*/
private function compileJs() {
foreach ($this->_tokens as $_) {
$this->next ($name, $value);
$this->parseToken($name, $value, $this->js);
}
}

/**
* output the js and die
*/
private function renderJs () {
echo "<script>$this->js</script>";
die();
}

/**
* changed referenced args to name and value of next token
*
* @param string $name
* @param string $value
* @param unknown_type $i, the amount of nexts to skip
*/
private function next(& $name, & $value, $i=1) {
for ($j=0; $j<$i; $j++) {
$this->current++;
if ($this->current > $this->count) $this->renderJs();
$_token = $this->_tokens[$this->current];
$this->getToken ($name, $value, $_token);
}
}

/**
* find and return first name matching argument
*
* @param mixed $_tokenNames
* @return string
*/
private function findFirst ($_needles) {
$name = $value = '';
for ($i=$this->current+1; $i<$this->count; $i++) {
$this->getToken($name, $value, $this->_tokens[$i]);
if (in_array($name, (array)$_needles)) {
return $name;
}
}
}

/**
* return javascript until match, match not included
*
* @param array $_needles
* @return string
*/
private function parseUntil ($_needles, $_schema=array(), $includeMatch = false) {
$name = $value = $js = $tmp = '';
while (true) {
$this->next ($name, $value);
$this->parseToken($name, $value, $tmp, $_schema);
if (in_array($name, (array)$_needles)) {
if ($includeMatch === true) {
return $tmp;
} else {
return $js;
}
}
$js = $tmp;
}
}

/**
* tries to find the token in $this->_convert, $this->_keep and $this->_keepValue
* if it fails it tries to find a method named as the token. If fails here also it throws away the token.
*
* @param string $name
* @param string $value
* @param string $js store js here by reference
*/
private function parseToken ($name, $value, & $js, $_schema=array()) {
//custom changes
if (in_array($name, array_keys ((array)$_schema))) {
$js .= $_schema[$name];
//change name to other value
} else if (in_array($name, array_keys ($this->_convert))) {
$js .= (!empty($this->_convert[$name])) ? $this->_convert[$name]: $name;
//keep key
} elseif (in_array($name, $this->_keep)) {
$js .= $name;
//keep value
} elseif (in_array($name, $this->_keepValue)) {
$js .= $value;
//call method
} else {
if (method_exists($this, $name)) {
$js .= $this->$name($value);
}
}
//ignore
}

/**
* converters
*
* These guys are equivalents to tokens.
*/

/**
* class definition
*
* @param sting $value
* @return string
*/
private function T_CLASS($value) {
$this->next ($name, $value, 2);
return "function $value() ";
}

/**
* define function
*
* @param string $value
* @return string
*/
private function T_FUNCTION($value) {
$this->next ($name, $value, 2);
return "this.$value = function";
}

/**
* echo is replaced with document.write
*
* @param string $value
* @return string
*/
private function T_ECHO($value) {
return 'document.write('.$this->parseUntil(';').');';
}

/**
* array. Supports both single and associative
*
* @param string $value
* @return string
*/
private function T_ARRAY($value) {
$_convert = array('('=>'{',     ')'=>'}',);
$js = $this->parseUntil(array(';'), $_convert, true);
if (strpos($js, ':') === false) {
$this->tmp = -1;
$js = preg_replace_callback ('/([{, \t\n])(\'.*\')(|.*:(.*))([,} \t\n])/Uis', array($this, 'cb_T_ARRAY'), $js);
}
return $js;
}

private function cb_T_ARRAY($_matches) {
$this->tmp++;
if (strpos($_matches[0], ':') === false) {
return ($_matches[1].$this->tmp.':'.$_matches[2].$_matches[3].$_matches[4].$_matches[5]);
} else {
return $_matches[0];
}
}
/**
* foreach. Gets converted to for (var blah in blih). Supports as $key=>$value
*
* @param string $value
* @return string
*/
private function T_FOREACH($value) {
$_vars = array();
while (true) {
$this->next ($name, $value);
if ($name == 'T_VARIABLE') $_vars[] = $this->cVar($value);
$this->parseToken($name, $value, $js);
if ($name == '{') {
if (count($_vars) == 2) {
$array = $_vars[0];
$val = $_vars[1];
$this->js .=
"for (var {$val}Val in $array) {".
"\n                        $val = $array"."[{$val}Val];";
}
if (count($_vars) == 3) {
$array = $_vars[0];
$key = $_vars[1];
$val = $_vars[2];
$this->js .=
"for (var $key in $array) {".
"\n                        $val = $array"."[$key];";
}
return '';
}
$jsTmp = $js;
}
}

/**
* declare a public class var
*
* @param string $value
* @return string
*/
private function T_PUBLIC ($value) {
$type = $this->findFirst(array('T_VARIABLE', 'T_FUNCTION'));
if ($type == 'T_FUNCTION') return '';
$js = '';
while (true) {
$this->next ($name, $value);
$this->parseToken($name, $value, $js);
if ($name == ';') {
$js = str_replace(array(' '), '', $js);
return 'this.'.$js;
} else if ($name == '=') {
$js = str_replace(array(' ','='), '', $js);
return 'this.'.$js.' =';
}
}
}

/**
* variable. Remove the $
*
* @param string $value
* @return string
*/
private function T_VARIABLE($value) {
return str_replace('$', '', $value);
}

/* helpers */

private function getToken(& $name, & $value, $_token) {
if (is_array($_token)) {
$name = trim(token_name($_token[0]));
$value = $_token[1];
} else {
$name = trim($_token);
$value = '';
}
}

private function cVar($var) {
return str_replace('$', '', $var);
}

/** debugging stuff. Ugly and deprecated. */

/** deprecated and sucks */
private $_openTags = array(
'T_OPEN_TAG', 'T_CLASS', 'T_PUBLIC', 'T_FOREACH', 'T_ARRAY', '{', 'T_VARIABLE', '('
);

/** deprecated and sucks */

/** deprecated and sucks */
private $indent = 0;
/** deprecated and sucks */
private $debug;


private $_closeTags = array(
'}', 'T_CLOSE_TAG', ';', ')',
);

public function __destruct() {
/**
$js = htmlentities ($this->js);
echo ("<pre>$js</pre>");
$this->write();
echo $this->debug;
//*/
}


private function write() {
$_tokens = token_get_all($this->src);
foreach ($_tokens as $key=>$_token) {
if (is_array($_token)) {
$name = trim(token_name($_token[0]));
$value = $_token[1];
} else {
$name = trim($_token);
$value = '';
}
$this->printToken($name, $value, $_token);
}
}

private function printToken ($name, $value, $_token) {
$value = htmlentities($value);

if (in_array($name, $this->_closeTags)) $this->indent--;
$indent = str_repeat('.&nbsp;&nbsp;&nbsp;&nbsp;', $this->indent);
if (in_array($name, $this->_openTags)) $this->indent++;
if (!empty($value))
$this->debug .= "
<br />$indent
<b>$name&nbsp;&nbsp;=&nbsp;&nbsp;'$value'</b>

";
else
$this->debug .= "
<br />$indent
<b>$name</b>

";
}
}
?>

Upload file php2js.php ke server. Kemudian buat file Baru dengan nama bebas, convert.php misalnya. Isikan convert.php dengan code PHP yang ingin anda convert (di bawah "/* Convert Code Start Here */"), kemudian upload ke web server. Misalnya seperti kode di bawah ini:



<?
require_once 'php2js.php';
new php2js(__FILE__);
/**
* My super cool php class that will be converted to js!!!
*/
/* Convert Code Start Here */
class HelloWorld {
/**
* So here goes a function that echos
*
* @param string $foo
* @param string $bar
*/
function foo($foo, $bar) {
echo $foo . ' ' . $bar;
}
}
$H = new HelloWorld;
$H->foo('Hello', 'World');
?>

Convert PHP To JavaScript

Buka file convert.php pada web browser, hasil yang keluar akan tampak seperti pada gambar Screenshot 1. Untuk melihat code JavaScript hasil convert, jika menggunakan browser Mozilla Firefox klik kanan pada halaman kosong web browser kemudian klik View Page Source (Screenshot 2), atau tekan tombol shortcut Ctrl + U. Pada jendela baru yang terbuka, anda akan melihat source code JavaScript hasil convert (Screenshot 3).



<script>
/**
* My super cool php class that will be converted to js!!!
*/
/* Convert Code Start Here */
function HelloWorld()  {
/**
* So here goes a function that echos
*
* @param string $foo
* @param string $bar
*/
this.foo = function(foo, bar) {
document.write( foo + ' ' + bar);
}
}
H = new HelloWorld;
H.foo('Hello', 'World');
</script>

convert_php_to_javascript1

Screenshot 1

convert_php_to_javascript2

Screenshot 2

convert_php_to_javascript3

Screenshot 3

Selesai. Semoga bermanfaat.
:)
Loncat ke Atas ↑