Tampilkan postingan dengan label PHP. Tampilkan semua postingan
Tampilkan postingan dengan label PHP. Tampilkan semua postingan

Kamis, 07 Juni 2018

Membuat Thumbnail Image Dengan PHP dan ImageMagick


Entah anda sekarang ini lagi bikin situs media sosial atatupun lagi bikin CMS; kode untuk membuat thumbnail harus anda ketahui. Thumbnail diperlukan untuk memberikan kesan power-text pada situs web, sehingga akan tampak lebih interaktif di mata penggunanya.

Untuk membuat thumbnail image dengan PHP, kita bisa memanfaatkan salah satu library pengolah grafis yang sudah banyak di-include di PHP. Library yang sudah umum dan biasanya digunakan untuk membuat thumbnail adalah GD dan ImageMagick.

Pada tulisan kali ini, kita akan membuat thumbnail di PHP dengan ImageMagick, karena ImageMagick lebih mudh dan sederhana jika dipilih untuk memproses gambar dalam resolusi besar menjadi berukuran thumbnail yang beresolusi lebih kecil.

Membuat thumbnail di PHP ataupun di bahasa pemrograman lainnya, sebenarnya prinsipnya sama saja. Thumbnail hanyalah bentuk gambar dalam resolusi kecil dan seragam. Artinya, thumbnail dihasilkan hanya dengan mengubah ukuran/resize gambar utama.

Masalahnya, gambar input yang harus dijadikan thumbnail umumnya memiliki rasio panjang x lebar yang tidak seragam. Sehingga, selain melakukan resize, gambar thumbnail yang akan dihasilkan sebelumnya harus di-crop dulu.

Algoritma untuk cropping simple kok. Ilustrasinya seperti gambar di bawah ini.

  Jika panjang (width) > tinggi (height), crop agar width = height. Offset pemotongan horisontal dihitung = (width - height) / 2.


Jika panjang (width) < tinggi (height), crop agar height = width. Offset pemotongan vertikal dihitung = (height - width) / 2.


function draw_thumbnail($file, $sz){
    $image = new Imagick($file);
    $w = $image->getImageWidth();
    $h = $image->getImageHeight();
    if($w > $h){
        $image->cropImage($h,$h,(($w-$h) / 2),0);
    } else if($w < $h){
        $image->cropImage($w,$w,0,(($h-$w) / 2));
    }
    $image->resizeImage($sz,$sz,Imagick::FILTER_LANCZOS,1);
    $image->setImageFormat('jpg');
    header('Content-type: image/jpg');
    echo $image;
}


Mudah sekali, kan? banyak programmer malah menggunakan library cuma untuk membuat thumbnail, padahal jika mau, kita hanya butuh beberapa baris kode di atas untuk melakukannya.

Contoh implementasi berikut akan memubuat thumbnail dari gambar contoh.png agar berukuran 50x50 px.

draw_thumbnail("/var/www/html/contoh.png",50);

Selamat mencoba...

Read more

Rabu, 27 September 2017

Menghitung Pengunjung Online Realtime Auto Refresh

Setelah sebelumnya kita membahas tentang Menghitung Pengunjung Online Dengan PHP dan SQLite, maka sekarang ini kita akan mengembangkan kode sebelumnya menjadi lebih dinamis. Umumnya online visitor counter tidak menyediakan layanan untuk menghitung jumlah pengunjung online secara realtime. Sehingga membuat online visitor counter sendiri harus dilakukan jika ingin melihat visitor counter berjalan realtime. Maksud realtime adalah keterangan jumlah pengunjung online akan berubah atau refresh sendiri saat jumlah pengunjung online bertambah/berkurang.

Sebelum Anda bisa mencoba kode berikut, pastikan anda sudah membaca artikel berjudul Menghitung Pengunjung Online Dengan PHP dan SQLite. Artikel ini sebenarnya hanyalah pengembangan dari artikel tersebut.

Dari kode sebelumnya, kita hanya perlu mengubah javascript agar dapat melakukan refresh dalam kurun waktu tertentu. Di sini saya memilih interval 10.000 ms, sehingga jumlah pengunjung online akan diperbarui secara realtime tiap 10 detik.

Untuk mendukung proses realtime; fungsi refresh dengan setTimeout() yang disediakan javascript bisa digunakan. Prototype-nya adalah sebagai berikut.

setTimeout(function, interval);

Sehingga jika dikolaborasikan dengan script online visitor counter sebelumnya, hasilnya akan menjadi seperti berikut:


<div id='online'></div>
<script>
 function print_online(){
  var xmlHttp = new XMLHttpRequest();
  xmlHttp.onreadystatechange = function() { 
   if (xmlHttp.readyState == 4 && xmlHttp.status == 200){
    document.getElementById('online').innerHTML = xmlHttp.responseText + " pengguna online";
   }
  }
  xmlHttp.open("GET", "http://localhost/online.php", true);
  xmlHttp.send(null);
  setTimeout(print_online,10000);
 }
 print_online();
</script>

Tidak berbeda jauh, bukan?
Sangat simpel, hanya dengan menabahkkan beberapa baris kode di atas anda sudah bisa membuat realtime online visitor counter untuk website/blog anda. Selamat mencoba.
Read more

Menghitung Pengunjung Online Dengan PHP dan SQLite

Jika anda memiliki website besar, anda pasti merasa percaya diri untuk menampilkan jumlah pengunjung online di website anda. Jangan biarkan trafik anda turun gara-gara loading halaman lambat. Perlu diketahui bahwa salah satu penyebab lambatnya loading website adalah terlalu banyak menggunakan script yang berjalan pada client-side (mis: javascript). Selain itu, terlalu banyak melakukan query database juga menyebabkan lambatnya loading website.

Umumnya, website kelas personal (blog) masih menampilkan jumlah pengunjung online / online visitor count dengan layanan counter gratis; misalnya seperti supercounters.com. Tanpa disadari, hal ini sangat empengaruhi waktu loading halaman web. Apalagi layanan seperti itu memiliki banyak user yang menginginkan jumlah pengunjung online dalam waktu yang sama. Ini membuat beban server penyedia online visitor counter lebih berat dan berimbas pada waktu load website anda sendiri.

Jika anda memiliki hosting sendiri, lebih baik anda membuat online visitor counter sendiri. Tapi jika tidak punya, ada banyak hosting gratis bisa anda coba; misalnya 3owl.com.

Membuat online visitor counter sendiri memang agak merepotkan. Tapi jika melihat script visitor counter yang bekerja dengan SQLite, membuat online visitor counter sendiri perlu dipertimbangkan. Ini karena, menurut beberapa referensi, SQLite mampu bekerja lebih cepat dalam mengolah database (link referensi). Jadi, memasang online visitor counter berbasis SQLite bisa dipastikan akan mempengaruhi waktu loading halaman web anda.

counter.php
Kode berikut ini adalah inti utama dari proses perhitungan pengunjung online. Setiap pengunjung yang mengakses website dibedakan berdasarkan alamat IP. Adapun tahapan proses yang dilakukan oleh kode ini adalah
- Memperoleh alamat IP pengunjung ($ip)
- Memperoleh waktu akses pengunjung ($curtime)
- Memperoleh waktu 3 menit yag lalu ($lowtime)
- Memeriksa apakah online.db sudah dibuatkan tabel 'counter'. Jika belum ada, buat!
  $db->exec("CREATE TABLE IF NOT EXISTS `counter` ...
- Memasukkan $ip dan $curtime pengunjung ke database  jika belum ada. Jika sudah ada, update kolom lastaccess dengan $curtime.
  $db->exec("INSERT OR REPLACE INTO counter ...
- Menghapus data pengunjung yang sudah 3 menit tidak melakukan aktivitas:
  $db->exec("DELETE FROM counter WHERE lastvisit < '$lowtime'");
- Menghitung jumlah pengunjung yang sedang aktif dalam kurun waktu 3 menit terakhir
  $res = $db->query("SELECT COUNT(ip) AS count from counter");

<?php
function get_online(){
 $ip = $_SERVER['REMOTE_ADDR'];
 $curtime = date("Y-m-d H:i:s");
 $lowtime = date("Y-m-d H:i:s", strtotime("-3 minutes"));

 $db = new SQLite3(dirname(__FILE__)."/online.db");
 $db->exec("CREATE TABLE IF NOT EXISTS `counter` (
   `ip` varchar(60) NOT NULL,
   `lastvisit` DATETIME NOT NULL,
   UNIQUE(`ip`)
 )");

 $db->exec("INSERT OR REPLACE INTO counter (ip,lastvisit) VALUES('$ip','$curtime')");
 $db->exec("DELETE FROM counter WHERE lastvisit < '$lowtime'");
 $res = $db->query("SELECT COUNT(ip) AS count from counter");
 $row = $res->fetchArray();
 return $row['count'];
}
?>

online.php
Kode ini akan mencetak angka dari counter.php
<?php
include 'counter.php';
echo get_online();
?>

Di halaman anda
Di setiap halaman anda, patikan anda menyisipkan kode ini di sekitar tag <body>. Jumlah pengunjung online akan diperoleh dari online.php dan dicetak pada elemen <div id='online'></div>.
...
<div id='online'></div>
<script>
 var xmlHttp = new XMLHttpRequest();
 xmlHttp.onreadystatechange = function() { 
  if (xmlHttp.readyState == 4 && xmlHttp.status == 200){
   document.getElementById('online').innerHTML = xmlHttp.responseText + " pengguna online";
  }
 }
 xmlHttp.open("GET", "http://DOMAIN-ANDA.com/online.php", true);
 xmlHttp.send(null);
</script>
...


Hasilnya
Saya sudah mencoba kode ini di localhost dan di website saya sendiri (link). Hasil screenshot di localhost terlihat seperti berikut:

Yap, itu tadi adalah sedikit tutorial singkat mengenai cara menghitung jumlah pengunjung online atau yang biasa disebut sebagai online visitor counter. Mudah-mudahan bermanfaat.
Read more

Jumat, 22 September 2017

Cara Membuat Youtube Downloader (Seperti Savefrom.net) Dengan PHP


Setelah kemarin saya menguraitutorial singkat mengenai cara membuat syntax highlighter dengan PHP, kali ini saya akan membahas 1 lagi tutorial lebih keren. Tulisan ini akan membahas tutorial membuat youtube downloader dengan PHP (mirip savefrom). Karena tidak mau repot, sekali lagi saya menggunakan class Youtube Downloader yang saya peroleh dari github (link).

Cara penggunaannya sangat mudah, lho:

<?php
$youtube = new Zarkiel\Media\Youtube();
$links = $youtube->getDownloadLinks('kode_video_id');
?>

Dari eksekusi kode di atas, kita sudah bisa memperoleh array link berisi berbagai direct link video yang diminta dalam berbagai kualitas resolusi dan format yang berbeda. Contoh output yag bisa diperoleh adalah:

Array
(
    [MP4] => Array
        (
            [High Quality - 1280x720] => http://...
            [Medium Quality - 480x360] => http://...
        )

    [FLV] => Array
        (
            [Low Quality - 400x226] => http://...
        )

    [3GP] => Array
        (
            [High Quality - 320x240] => http://...
            [Medium Quality - 176x144] => http://...
        )

    [WEBM] => Array
        (
            [Low Quality - 640x360] => http://...
        )
)

Class Youtube downloader PHP ini bekerja berdasarkan video id youtube. Tiap kita menonton sebuah video, kita bisa melacak ID tersebut pada URL nya. Misalnya adalah pada teks tercetak tebal di URL youtube : https://www.youtube.com/watch?v=tPEE9ZwTmy0.

Untuk memudahkan proses ekstraksi/mengambil ID video youtube dari URL, saya menggunakan fungsi berikut:

function get_yt_id($url){
 if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) {
  $id = $match[1];
  return $id;
 } else return NULL;
}

Jika ID video sudah diperoleh, kita tinggal menyampaikan nilai ID tersebut ke dalam class. Jika ingin menambilkan thumbnail video tak usah repot-repot; gunakan link https://i.ytimg.com/vi/ID_VIDEO/hqdefault.jpg.

Singkatnya, dari sebuah link youtube, script youtube downloader dapat mengekstrak link download dengan kode berikut.

$id = get_yt_id($_POST('url')); // link video input
$youtube = new Zarkiel\Media\Youtube();
$links = $youtube->getDownloadLinks($id);

echo "<center>
<img src='https://i.ytimg.com/vi/$id/hqdefault.jpg' style='max-width:300px;display:block;border-radius:6px;' class='mb-3'></img>
<div class='btn-group-vertical'>";
foreach($links as $a => $b){
 
 foreach($b as $c => $d){
  echo "<a class='btn btn-primary mb-2' href='$d'>Download $a $c</a>";
 }
}
echo "</div></center>";

Cara mengekstrak aray link hasil pencarian link adalah dengan metode looping mengguakan foreach. Dengan melihat contoh output struktur yang saya perlihatkan di atas tadi, tentunya kita bisa menginterpretasikan contoh di atas dengan mudah, terutama saat mengolah array yang berisi link-link download.

foreach($links as $a => $b){
 foreach($b as $c => $d){
  echo "<a class='btn btn-primary mb-2' href='$d'>Download $a $c</a>";
 }
}

Variabel $a menampung nama format video (MP4/FLV/3GP/...), $b berisi array link yang tergolong sebagai format video sesuai $a. Karena $b masih berbentuk array, kita perlu memecahnya lagi sehingga diperoleh $c sebagai detail format (misal: High Quality - 1280x720) dan $d sebagai link downloadnya.

Contoh implementasinya sudah saya buat di link website Youtube downloader milik saya (http://tools.komputoo.pw/youtube-downloader). Dari pembutan project script youtube video downloader ini, saya menilai bahwa cara membuat situs youtube downloader seperti savefrom bukanlah hal yang sulit jika kita mau memanfaatkan class/library gratis dari internet.

Saya kira anda pun bisa membuat situs untuk menyaingi savefrom. Apalagi class Youtube downloader ini sagat sederhana, ukurannya tidak lebih dari 10 KB. Sangat mudah untuk dipelajari bagimana mendapatkan direct link video youtube secara programatis.
Read more

Rabu, 20 September 2017

Cara Membuat Syntax Highlighter Dengan PHP

Saya mulanya terinspirasi hilite.me, sebuah situs sederhana yang menawarkan online syntax highlighter. Mulailah saya menelusuri github dan google untuk mempermudah keinginan saya membuat situs serupa.


Daru upaya ini, saya menemukan Highlight.php dari github (link), sebuah script class PHP untuk mempermudah pembuatan online syntax highlighter. Menurut pemegang kendali project ini, highlight.php merupakan pengembangan dari kode proyek highlight.js (link) yang sudah ada sebelumnya.

Dengan memakai bantuan class milik highlight.php, membuat syntax highlighter dengan PHP menjadi sangat mudah. Bahkan saya sudah membuatnya dan menjalankannya sebagai salah satu tools milik Komputoo (http://tools.komputoo.pw).

Berikut ini contoh kode implementasi syntax highlighter yang saya copy dari highlight.php.

<?php
require_once("Highlight/Autoloader.php");
spl_autoload_register("Highlight\\Autoloader::load");

$hl = new Highlight\Highlighter();
$r = $hl->highlight("html", file_get_contents(__FILE__));

?>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="styles/default.css">
    </head>
    <body>
        <pre><code class="hljs <?=$r->language?>"><?=$r->value?></code></pre>
    </body>
</html>

Yang paling pertama, kita harus meng-include source code Autoloader.php dan mendaftarkan autoload; agar bisa menggunakan class milik highlight.php.

require_once("Highlight/Autoloader.php");
spl_autoload_register("Highlight\\Autoloader::load");

Lalu buat objek highlight.php baru.

$hl = new Highlight\Highlighter();

Objek inilah yang bisa kita gunakan untuk melakukan syntax highlighting.

$r = $hl->highlight("<jenis syntax kode>", "<source code yang ingin di-highlight>");

Hasil dari proses highlight tersebut bisa diekstraksi dengan mudah.

$r->language --> jenis syntax yang barusan di-highlight
$r->value --> kode HTML yang sudah siap ditampilkan 

Sehingga, jika digabungkan...

<pre><code class="hljs <?=$r->language?>"><?=$r->value?></code></pre>

Selain mudah, highlight.php juga saya akui lengkap fiturnya. Saya bismemilih banyak sekali tema syntax yangsudah disediakan olehnya. Untuk menggunakan tema tersebut, janga lupa include CSS sebelum kode hasil di-plot.

<link rel="stylesheet" type="text/css" href="styles/default.css">

Anda bisa mengubah style default.css dengan style lain yang anda suka. Hasilnya, syntax highlighter online yang berhasil saya buat nampak seperti berikut (link demo).



Yap, sekian dulu tutorial singkat dari saya mengenai cara membuat syntax highlighter dengan PHP. Selamat mencoba :)
Read more

Minggu, 17 September 2017

Cara Mengatur Cron Job CodeIgniter Dari cPanel

Biasanya, script PHP bisa dijalankan dengan cron melalui beberapa metode. Bisa dengan fetching alamat web dengan command  wget atau curl. Atau dengan menjalankan script yang diinginkan dengan metode CLI melalui command php.

0 0 * * * /usr/bin/curl http://web-url/cron.php
0 0 * * * /usr/bin/wget http://web-url/cron.php

0 0 * * * /usr/bin/php /path/to/cron.php

Menurut saya, metode dengan command PHP jauh lebih efektif. Karena di antara ketiga metode, cara ini tidak akan dipengaruhi oleh timeout server. Jadi, jika kerja cron membutuhkan waktu lama dan rentan terkendala timeout, metode ini sangat cocok untuk diterapkan.

Umumnya script untuk cron ditulis sebagai path ke program php dan diikuti script cron yang perlu dijalankan. Misalnya

0 0 * * * /usr/bin/php /path/to/cron.php

Tapi bagaimana cara kita memanggil method dari controller CodeIgniter dari cron?

Mudah saja, penulisannya sama seperti contoh di atas. Namun script yang dituju bukanlah controller, melainkan index.php. Sementara itu, controller dan method yang diakses juga disertakan sebagai parameter untuk command cron.

0 0 * * * /usr/local/bin/php /home/thuglife/public_html/index.php controller method ...


Penting untuk diingat bahwa anda harus menggunakan php dari sisi lokal (/usr/local/bin/php). Jika tidak, cron hanya bekerja seperti mengakses homepage / default contoller codeigniter. Mungkin jika cron hanya dibuat di komputer sendiri tidak akan ada pengaruhnya. Tapi, script cron akan bermasalah dan menampilkan default controller / home page apabila berjalan pada shared hosting.


Read more

Sabtu, 09 September 2017

Cara Mudah Grab Konten Blog Orang Dengan PHP

Komputoo sudah lahir sejak beberapa tahun yang lalu, sampai sekarang masih kurang dari 300 artikel yang berhasil diterbitkan. Ada saja perasaan malas untuk melanjutkan blogging, tapi dengan dedikasi dan percaya bahwa kerja kerasa tidak akan pernah ada ruginya; Komputoo tetap setia berada di internet menyajikan informasi dan tutorial berkualitas. :D

Sebagai gantinya, rasa malas itu mulai dimanfaatkan penulis ke arah lebih positif. Rasa malas tersebut melahirkan ide untuk membuat grabber blog berbasis PHP dan RSS. Tidak sulit membuat grabber, apalagi jika sudah memiliki pengalaman dalam pemrograman OOP. Salah satu objek grabber yang bisa diambil peluangnya adalah RSS(Really Simple Syndication) yang hampir semua situs maupun blog memilikinya.


Untuk melihat RSS tiap blog, kita cukup melihat kode sumber laman dari blog target.


Contoh kode meta RSS adalah sebagai berikut:

<link href='http://www.blogger.com/feeds/5968298389595427058/posts/default' rel='alternate' title='Komputoo Tech - Atom' type='application/atom+xml'/>

Jangan senang dulu, metode grabber melalui RSS kadang butuh keberuntungan. Karena tidak semua blog menyajikan seluruh konten dalam deskriptor RSS. Sering kali hanya ringkasan. Jika target dirasa sudah tepat, buka URL RSS dan kopi semua kodenya di https://codebeautify.org/xmlviewer. Klik Tree View dan pelajari struktur RSS tersebut.


Kode RSS tersaji dalam format XML; dan cara termudah mengolahnya adalah dengan SimpleXML. Berikut referensinya:

http://php.net/manual/en/book.simplexml.php

$rss = simplexml_load_file('URL RSS');
$namespaces = $rss->getNamespaces(true);
$items = $rss->channel->item;
foreach ($items as $item){
 $content->title = $item->title;
 $content->content = $item->children($namespaces['atom'])->summary;
 $content->source = $item->link;
 $content->date = date("Y-m-d", strtotime($item->children($namespaces['atom'])->updated));
 $content->uid = md5($content->source);
 $content->image = $item->children($namespaces['media'])->thumbnail->attributes()->url;
 $content->dump();
 //Tambahkan fungsi untuk memasukkan $content ke database
 echo "<hr/>";
}

Langkah paling awal dalam proses grabber adalah mengunduh kode XML dari RSS dan menjadikannya sebagai objek.

$rss = simplexml_load_file('URL RSS');

Biasanya aanda akan menemukan kode tag XML <dc:creator></dc:creator> dalam RSS. untuk mengakses tag ini, anda harus memproses namespaces terlebih dahulu.

$namespaces = $rss->getNamespaces(true);

Jika sudah, perhatikan baik-baik struktur RSS yang sudah kita lihat di awal. Umumnya, konten posting blogger tersaji dalam bentuk array di bawah $rss->channel->item.

Karena array, kita jadi lebih mudah memilah-milahnya dengan foreach.

foreach ($items as $item){
 //lakukan sesuatu untuk tiap $item
}

Komponen posting tanpa namespavces bisa diakses seperti mengakses objek biasa, contohnya saja $item->title untuk judul. Tapi, kalau sudah berhadapan dengan namespace, mau tak mau gunakan kode yang agak lebih panjang.

<title>Judul</title>
$item->title

<atom:summary>Ringkasan</atom:summary>
$item->children($namespaces['atom'])->summary;

Sesekali kita juga harus mengakses atribut. Kode yang diperlukan ditulis semacam ini:


<thumbnail url="???">...</thumbnail>
$item->thumbnail->attributes()->url;

<atom:thumbnail href="???">...</atom:thumbnail>
$item->children($namespaces['atom'])->thumbnail->attributes()->href;

Yak, mungkin sampai disini saja penjelasan dari saya. Sebenarnya proses grabbing mudah saja kalau targetnya mendukung. Kalau ada kode yang tidak diketahui, ada dokumentasi lengkap dan sebagian besar juga dibahas di stackoverflow.

Ada pula metode grabbing lain, yaitu dengan DOM(Document Object Model). Metode ini bisa dilakukan dengan mengekstrak langsung dari halaman berformat HTML yang biasa kita lihat. Kita tidak akan membahasnya sekali waktu ini, mngkin di kesempatan lain, saya akan tuliskan tutorial untuk itu.

Selamat mencoba, happy coding. ;)
Read more

Cara Membuat Slug Pada Judul Artikel [PHP]


Istilah slug terdengar familiar bagi programmer PHP yang pernah mendalami desain CMS untuk menampung artikel. Misalnya

Judul : Cara Membuat Slug Pada Judul Artikel [PHP]
Slug : cara-membuat-slug-pada-judul-artikel-php

Sekilas sederhana dan tak berguna, ya. Tapi menurut kata para pakar ahli SEO link artikel yang dibuat dengan model slug jauh lebih SEO friendly, karena di dalam link tersebut terdapat kata kunci penguat bagi judul dan isi artikel blog yang terkait dengan link tersebut.

Tanpa slug : http://www.komputoo.pw/?article=8928
Dengan slug :
(1) http://www.komputoo.pw/article/cara-membuat-slug-pada-judul-artikel-php
ATAU
(2) http://www.komputoo.pw/8928/cara-membuat-slug-pada-judul-artikel-php

URL SEO friendly dengan slug bisa diimplementasikan dengan berbagai macam cara, seperti kedua contoh di atas. Contoh (1) bisa diimplementasikan apabila slug dibuat dan disimpan saat pertama kali artikel diterbitkan. Sementara metode (2) bisa diimplementasikan untuk yang ingin CMS nya lebih cepat, karena pencarian artikel berdasarkan ID dalam data tipe INT lebih cepat dilakukan daripada ID artikel yang disimpan dalam bentuk string slug.

Metode kedua hanya akan mencari artikel dari database berdasarkan ID = 8928. Sementara kode slug hanya dibuat sebagai pelengkap setelah judul dan konten artikel diambil dari database.

function slug($str){
 $str = strtolower($str);
 $str = preg_replace("([^a-z0-9]+)"," ",$str);
 $str = preg_replace("([ ]+)"," ",$str);
 $str = str_replace(' ','-',$str);
 return $str;
}

Saya rasanya tidak perlu menjelaskan, ya. Langsung saja comot kodenya jika anda perlu. :D
Read more

Selasa, 05 September 2017

Cara Caching Hasil API Dari Web Service Dengan Database MySQL


Beberapa website yang menyediakan katalog data untuk umum biasanya menyediakan API (Application Programming Interface) agar semua datanya bisa diambil oleh implementor.

Akan tetapi, ada beberapa hal sepele yang perlu menjadi sorotan perhatian. Contohnya saja pada pengaplikasian Youtube grabber. Ada batasan kueri API dalam jumlah tertentu yang perlu diketahui. Kalaupun tidak ada, seorang programmer sebaiknya memiliki etika dalam menggunakan API dari web service gratisan. Layanan gratis sudah sepantasnya digunakan secara bijak, dalam kurung tidak boleh membebani server.

Atas dasar itulah, penting untuk menyediakan fitur caching dalam pengaksesan API, sehingga kueri yang sering diminta tidak melulu dikirim ulang secara sekuential dalam kurun waktu yang tidak jauh berbeda.

Cara termudah untuk mengimplementasikan API caching adalah dengan memanfaatkaan database. Pada penjelasan kali ini, saya menggunakan database berbasis MySQL.

CREATE TABLE `api_cache` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `kode` varchar(200) NOT NULL,
 `data` mediumtext NOT NULL,
 `total_akses` int(11) NOT NULL,
 `waktu_input` datetime NOT NULL,
 `akses_terakhir` datetime NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `kode` (`kode`)
);


Struktur database di atas terdiri atas elemen-elemen penting dalam mendukung proses caching. Kolom kode adalah kode identifikasi API, bisa berupa URL unik ataupun katakunci yang berkaitan dengan data yang sudah tersimpan. Kolom data menyimpan hasil kueri API; jenisnya tergantung kebutuhan; bisa TEXT, MEDIUMTEXT ataupun LONGTEXT. waktu_input adalah waktu saat pertama kali data hasil kueri diinput ke database. Terakhir yang tidak alah penting; total_akses dan akses terakhir yang nantinya berguna bagi admin, ketika database berlebihan kapasitas. Kedua kolom ini bisa diseleksi nilainya untuk mengetahui data yang tidak begitu sering diakses ulang.

Sekarang, saatnya implementasi (Maaf, kode ini implementasi ditulis berdasarkan gaya CodeIgniter; namun lumayan mudah untuk diterjemahkan ke kode PHP native, kok).

Sebelum mengakses API, program harus memeriksa apakah hasil kueri API sejenis sudah pernah diinputkan ke dalam database.

public function ambil($kode){
        $this->db->where('kode', $kode);
        $query = $this->db->get('api_cache');
        if($query->num_rows() != 0){
            $hasil = $query->row();
            $this->db->where('id', $hasil->id);
            $this->db->set('total_akses', 'total_akses+1', FALSE);
            $this->db->set('akses_terakhir', '"'.date("Y-m-d H:i:s", time()).'"', FALSE);
            $this->db->update('api_cache');
            return $hasil->data;
        }
        return NULL;
    }


Apabila data belum pernah dimasukkan, fungsi di atas akan mengembalikan nilai NULL. Ini juga berarti bahwa API bisa dieksekusi langsung.

Tugas belum selesai, hasil data eksekusi API, harus segera dimasukkan ke dalam database. Sehingga, dilain waktu, apabila kueri serupa dieksekusi, program hanya perlu mengambil data dari database. Bukan hanya tidak merugikan server yang memberikan layanan web service, dengan cara ini, eksekusi kode jauh lebih cepat.

public function tambah($kode,$data){
        $this->kode = $kode;
        $this->data = $data;
        $this->total_akses = 0;
        $this->waktu_input = date("Y-m-d H:i:s", time());
        $this->akses_terakhir = date("Y-m-d H:i:s", time());
        $this->db->insert('api_cache',$this);
    }


Selamat mencoba :)
Read more

Memperoleh Database Klasifikasi Makhluk Hidup Dengan CatalogueOfLife Web Service API


Blogging bisa jadi membosankan apabila kita sudah kehabisan ide untuk ditulis sebagai postingan baru. Jika kalian merasa demikian, coba ikuti ide saya.

Setelah lama terjun dalam dunia blogging, rupanya pundi rupiah masih tak kunjung penuh untuk memenuhi hasrat keinginan sehari-hari. Sehingga saya mulai bereksperimen membuat mesin pencari konten LOMBA ASIA. Saya akhirnya sadar, ada cara lebih mudah untuk menghasilkan pemasukan pasif dari internet.

Keluar dari tema lomba, saya berusaha menemukan ide konten yang mudah diperoleh untuk dipublikasikan kembali. Bertemulah saya dengan web fishbase.org dan catalogueoflife.org. Dari kedua objek itu, saya akhirnya memilih catalogueoflife.org dan segera mempelajari API web service-nya. Usaha tersebut begitu berat, tapi semua terbayarkan setelah http://namalatin.web.id selesai saya rilis.

Saya tidak akan membagikan source kode web nama latin tersebut, tapi setidaknya kali ini kalian akan mempelajari bagaimana memperoleh data dari catalogueoflife.org dari saya. Soal pengolahan dan sisanya, silahkan pelajari sendiri, ya. hehe :D

Jika ada yang belum jelas dari tutorial ini, silahkan baca dokumentasinya sendiri dari link berikut: http://www.catalogueoflife.org/annual-checklist/2017/webservice

Data spesies makhluk hidup dapat dicari dari titik pusat web service catalogueoflife.org; dan diikuti dengan parameter request berisi data yang ingin dicari. Parameter tersebut antara lain:
name             Kata kunci yang ingin dicari, mialnya "ikan", "singa", "Oreochromis niloticus" atau "tiger"
id                  Data spesies yang ingin diperoleh berdasarkan ID record spesifik. Gunakan ini, setelah kita mencari data dengan parameter name dan ingin memperoleh informasi detail dari tiap nama yang ditemukan. Tiap nama yang ditemukan akan memiliki ID unik.
format           Format hasil yang ingin anda peroleh. Anda bisa memilih nilai berikut: format=xml, format=json (default) dan format=php;
response       Tipe hasil yang diperoleh. Konfigurasi yang valid adalah response=terse (default) dan response=full. Format terse akan mengembalikan data rinci,sementara format full akan mengembalikan data lengkap. Perbedaan detailnya, silahkan baca referensi link diatas.
start               Record pertama yang harus dikembalikan. Misalnya, kata kunci "ikan" ditemukan hasil 100. Jika ditentukan nilai start=50, record 0 - 50 diabaikan. Nilai parameter ini penting, mengingat bahwa jumlah record maksimum yang dikembalikan oleh response=terse adalah 500 dan untuk response=full hanya 50.

Pencarian Data
Pencarian data sebaiknya menggunakan format=terse agar tidak memberatkan server. Lagipula, hasil pencarian yang ditampilkan biasanya hanya nama dan beberapa data lain yang tidak begitu spesifik.

<?php
function cari_nama($katakunci,$mulai){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://www.catalogueoflife.org/annual-checklist/2017/webservice?name=$katakunci&format=json&response=terse&start=$mulai");
 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla Firefox 1.0");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 $hasil = curl_exec($ch);
 if(curl_errno($ch) == 0){
  curl_close($ch);
  return json_decode($hasil);
 }
 curl_close($ch);
 return NULL;
}
?>

Pencarian ID
Hasil pencarian ID dapat dipastikan hanya mengembalikan 1 buah record saja (apabila ID valid). Format=full sangat tepat dipilih, untuk memperoleh detail data yang lengkap.

<?php
function cari_id($id){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://www.catalogueoflife.org/annual-checklist/2017/webservice?id=$id&format=json&response=full);
 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla Firefox 1.0");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 $hasil = curl_exec($ch);
 if(curl_errno($ch) == 0){
  curl_close($ch);
  return json_decode($hasil);
 }
 curl_close($ch);
 return NULL;
}
?>


Tiap kali pemanggilan API, baik itu pencarian ID ataupun dengan katakunci, hasilnya akan diapit oleh struktur data semacam ini:

<results id="" name="" total_number_of_results="" number_of_results="" start="" error_message="" version="1.9 rev c957d6a">

     <result></result>     <!-- one <result /> for each record returned -->

</results>

Jika hasil ditemukan,  total_number_of_results tentu saja bukan 0. Hasil yang ditemukan akan disimpan sebagai array objek result, yang merupakan anakan objek results. Ada banyak varian objek result. Kita bisa mengetahuinya dengan melihat result->name_status. Sejauh ini, saya mengetahui name_status bisa salah satu dari string accepted_name, common_name, synonym, ambiguous_synonym atau higher_taxa.
(PENTING: Lihat macam-macam varian dan bentuknya dari link referensi di atas)

Contoh Implementasi
Dari 2 fungsi PHP di atas, saya akan menunjukkan bagaimana menampilkan hasil yang berkaitan dalam bentuk list sederhana.

<?php
...
$hasil = cari_nama("dog");
foreach ($hasil->results as $item){
 echo "<li>{$item->name}</li>"
}
?>


Lebih lanjutnya, silahkan pelajari sendiri dari dokumentasi, ya. Selamat mencoba :D
Read more

Selasa, 20 Juni 2017

Menambah Cron Job yang Dibatasi Server

Sebuah media terkadang harus melakukan sesuatu secara terjadwal. Sebagai contoh, ketika media harus mengupdate informasi dari suatu website secara berkala. Akan tetapi, layanan dari server kadang dibatasi untuk sejumlah cron job tertentu. Hal ini menjadi masalah ketika pada prakteknya kita membutuhkan lebih banyak cron job dari total entri cron job yang disediakan oleh layanan server.

Hal ini bisa diatasi dengan membuat entri cron job untuk dieksekusi dari pihak eksternal/3rd party. Dan, pada tulisan ini, kita akan melihat contoh pelaksanaannya dengan layanan cron job dari www.cron-job.org.

Daftarnya sangat mudah, tinggal masuk ke halaman sign up,lalu isikan data diri seperti pendaftaran biasa. Layanan ini disediakan secara gratis, tanpa ada embel-embel trial ataupun premium account. Jumlah cron job yang bisa ditambahkan tidak dibatasi, namun selalu direkomendasikan untuk menggunakan layanan secara wajar. Jika tidak, tentu akun anda akan kena banned.

Perlu diperhatikan juga mengenai efisiensi waktu eksekusi script yang diinputkan sebagai cron job. Karena banyak user yang memakai layanan ini, setiap script harus selesai dalam maksimal 30 detik. Jika script melebihi waktu itu secara berulang-ulang, pihak sana akan melakukan suspend script tersebut.



Demikianlah informasi mengenai cara menambah entri cron job yang dibatasi jumlahnya oleh server. Selamat mencoba, mudah-mudahan bermanfaat.
Read more

Rabu, 15 Februari 2017

Membaca RSS Dengan PHP Sangat Mudah

Sebagian besar CMS sudah mendukung fitur RSS. Dengan RSS, kita dapat memperoleh ringkasan konten website dengan lebih mudah. Contoh penggunaanya misalnya apabila hendak menampilkan recent post. Tentu saja kita tidak memerlukan keseluruhan properti dari konten. Paling tidak, kita cukup memerlukan Judul dan tanggal publikasi. Daripada harus berurusan dengan database, menampilkan hasil berdasarkan RSS akan jauh lebih mudah.


Sebelum memproses RSS, kita perlu mengetahui struktur dari RSS itu sendiri. Cara termudah adalah dari mengamati XML tree viewer (codebeautify.org/xmlviewer). Sebagai contoh kasus, tulisan ini akan menggunakan RSS versi 2 dari blog Komputoo.
http://www.komputoo.tk/feeds/posts/default?alt=rss

Jika dilihat-lihat, bentuk strukturnya secara ringkas akan terlihat seperti di bawah ini.

<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" ... version="2.0">
 <channel>
  <atom:id>tag:blogger.com,1999:blog-5968298389595427058</atom:id>
  <lastBuildDate>Thu, 16 Feb 2017 06:44:18 +0000</lastBuildDate>
  <category>Assembly</category>
  ...
<category>ZLIB</category> <title>Komputoo Tech</title> <description>Belajar Teknologi Itu Menyenangkan!</description> <link>http://www.komputoo.tk/</link> <managingEditor>noreply@blogger.com (Muhammad Irvan Hermawan)</managingEditor> <generator>Blogger</generator> ... <item> <guid>...</guid> <pubDate>Wed, 15 Feb 2017 08:03:00 +0000</pubDate> <atom:updated>2017-02-15T00:03:47.699-08:00</atom:updated> <category ...>Share</category> <category ... >Web</category> <title>Melihat Internet Dalam Satu Detik</title> <description>Pernahkah terpikirkan, ...</description> <link>http://...melihat-internet-dalam-satu-detik.html</link> <author>noreply@blogger.com (Muhammad Irvan Hermawan)</author> <media:thumbnail ... url="???" .../> <thr:total>0</thr:total> </item> <item> ... </item> <item> ... </item> <item> ... </item> </channel> </rss>

Nah, tampak jelas bahwa bagian deskripsi utama yang menunjukkan detail web ada di bawah bagian rss->channel. Lalu deskripsi spesifik tiap post ada di rss->channel->item, yang tersusun dalam deretan array. Setelah kita tahu ini, membaca RSS akan terasa lebih mudah. Langsung saja, lihat dan praktekkan kode berikut pada server anda.

<?php
$rss = simplexml_load_file("http://www.komputoo.tk/feeds/posts/default?alt=rss");
$items = $rss->channel->item;
foreach ($items as $item){
 $judul = $item->title;
 $tgl = date("j m y", strtotime($item->pubDate));
 $pnl = explode("(", $item->author)[1];
 $pnl = explode(")", $pnl)[0];
 
 echo "<li>". $judul . " ";
 echo $tgl . " ";
 echo $pnl . "</li>";
}
?>

Hasilnya...

Cara termudah untuk mengakses tiap konten tag XML pada RSS adalah menggunakan fungsi SimpleXML. Setelah file XML diload dengan simplexml_load_file(), setiap tag di dalamnya dapat diakses layaknya mengakses member dari suatu objek. Misalnya, jika ingin mengakses judul dari postingan ke-2 dari RSS tersebut, kita dapat melakukannya secara langsung dengan kode ini:

rss->channel->item[1]->title

Bentuk XML yang digunakan dalam RSS sama persis dengan yang digunakan HTML. Beberapa elemen RSS juga akan ditemukan atribut di dalamnya. Apabila ingin mengaksesnya, gunakan method attributes() untuk memperoleh list objek atribut yang dapat diakses. Misalnya, apabila struktur salah satu elemen dalam item terlihat seperti ini:

<link url="???"></link>

Atribut url di atas dapat diakses dengan kode ini:

$rss->channel->item[x]->attributes()->url

Sangat mudah, ya! Eits, belum sampai disitu. kita harus mengetahui cara mengakses tag yang tertulis bersama namespace, seperti berikut.

<media:thumbnail ... url="???" .../>

Cara mengakses tag semacam itu adalah dengan memperoleh objek namespace dari objek XML yang telah diload.

$namespaces = $rss->getNamespaces(true);

Untuk selanjutnya, atribut url di atas dapat diakses dengan kode seperti ini:

$rss->channel->item[x]->children($namespaces['media'])->thumbnail->attributes()->url;

Sekian tips dari saya, semoga bermanfaat.

Read more

Selasa, 25 Oktober 2016

Membuat Navigasi Halaman (Page Navigation) dengan PHP


Walaupun cuma berisi angka, nyatanya tidak banyak yang bisa membuat page navigation. Karena membuat page navigation tidak semudah membalikkan tangan.

Membuat page naviagtion itu mudah setelah kita tahu bagaimana behavior page navigation yang akan dibuat. Karena ada banyak cara tentang bagaimana page navigation ini bekerja, maka untuk tulisan ini, kita hanya akan membahasa tentang salah satu model saja. Berikut behavior page navigation yang akan kita buat..
  • Setiap page yang sedang dipilih akan berusaha memiliki maksimal 3 sisi buah page disampingnya.
  • Setelah kita membuat 3 page kosong dibagian kiri; Jika di bagian kirinya lagi terdapat >= 1 page lain, selain angka 1; maka sisa page itu akan diganti elipsis ( ... ). Begitu pula jika dibagian kanan; kita harus melihat jumlah halaman totalnya.


Untuk membuat sebuah page, ada beberapa parameter yang harus disediakan.

WritePage($pageStart,$itemCount,$pageCapacity)

pageStart: Halaman yang diinginkan.
itemCount: Jumlah total konten yang dimiliki
pageCapacity : Jumlah konten/item yang ditampung setiap page.
Tahapan awal yang perlu dilakukan adalah mengetahui jumlah page dari parameter yang telah diberikan. Rumusnya adalah...
$pageCount = $itemCount / $pageCapacity;

Sebelum diproses dengan rumus tersebut, itemCount harus dibulatkan(align) menjadi kelipatan pageCapacty. Misal: pageCapacity 10, itemCount 99 --> itemCount diubah jadi 100; pageCapacity 10, itemCount 80 --> itemCount tetap 80; pageCapacity 10, itemCount 81 --> itemCount diubah jadi 90. Rumit? Tenang, saya sudah siapkan kode untuk ini.

function AlignValue($value,$align){
    if($value % $align){
        $value += ($align - ($value % $align));
        return $value;
    }
    else return $value;
}


Jadi, total halaman yang ada adalah: AlignValue (itemCount, pageCapacity) / pageCapacity.
Masih penasaran kenapa harus menggunakan AlignValue() ? bayangkan ada 19 item dengan kapasitas 10 item. Kalau tidak di align; 19 / 10 = 1 ! Padahal kita butuh 2 halaman, lho.

Sekarang, kita sudah bisa mulai membuat page nya; dimulai dari menulis page di bagian kiri dari halaman yang terpilih (pageStart).

1. Jika page pertama dari 3 page sebelum page terpilih (pageStart) adalah 1 atau 2, maka kita langsung saja menulis page navigation secara berurutan. Misal pageStart nya halaman 5 atau 6:
5 > 1 2 3 4 5
6 > 1 2 3 4 5 6 
 
    if ($pageStart-3 <= 2){
        for($p = 1; $p < $pageStart; $p++){
            echo "|$p|";
        }
    }


2. Tapi, jika lebih dari itu, kita harus menulis elipsis. Misal pageStart 7 atau 8.
5 > 1 ... 4 5 6 7
6 > 1 ... 5 6 7 8

    else{
        echo "|1||...|";
        for($p = $pageStart-3; $p < $pageStart; $p++){
            echo "|$p|";
        }
    }

 
3. Bagian kiri beres. Kita tulis dan tandai tebal, di halaman mana kita sekarang.

echo "<b>|$pageStart|</b>";

4. Sekarang tulis page di sebelah kanan pageStart.
Jika halaman terakhir dari 3 page pengikut pageStart berada tepat sebelum page terakhir, atau selebihnya;  kita tulis page langsung tanpa elipsis. Misal pageStart 6, 7 atau 8 dari total (pageCount) berjumlah 10.
6 > 6 7 8 9 10
7 > 7 8 9 10
8 > 8 9 10

    if ($pageStart+3 >= $pageCount-1){
        for($p = $pageStart+1; $p <= $pageCount; $p++){
            echo "|$p|";
        }
    }


5. Tapi, jika tidak; kita perlu membuatkan elipsis. Misalnya pada pageStart 4 atau 5 dari total page 10.
4 > 4 5 6 7 ... 10
5 > 5 6 7 8 ... 10

    else{
        for($p = $pageStart+1; $p <= $pageStart+3; $p++){
            echo "|$p|";
        }
        echo "|...||$pageCount|";
    }


Full code
<?php
function AlignValue($value,$align){
    if($value % $align){
        $value += ($align - ($value % $align));
        return $value;
    }
    else return $value;
}
function WritePage($pageStart,$itemCount,$pageCapacity){
    $itemCount = AlignValue($itemCount,$pageCapacity);
    $pageCount = 0;
    $pageCount = $itemCount / $pageCapacity;
   
    //write before current
    if ($pageStart-3 <= 2){
        for($p = 1; $p < $pageStart; $p++){
            echo "|$p|";
        }
    }
    else{
        echo "|1||...|";
        for($p = $pageStart-3; $p < $pageStart; $p++){
            echo "|$p|";
        }
    }
   
    echo "<b>|$pageStart|</b>";
    //write after current
    if ($pageStart+3 >= $pageCount-1){
        for($p = $pageStart+1; $p <= $pageCount; $p++){
            echo "|$p|";
        }
    }
    else{
        for($p = $pageStart+1; $p <= $pageStart+3; $p++){
            echo "|$p|";
        }
        echo "|...||$pageCount|";
    }
}

WritePage(6,121,10);
?>


Bagaimana dengan link URL untuk navigasi ?
Kodenya hanya perlu dimodifikasi sedikit. Dengan tambahan parameter $cont (container) dan $link (url/link). Format page navigation yang saya buat adalah:

<li><a href=’?page=halaman’>halaman</a></li>

Dengan fungsi baru yang telah dimodifikasi berikut ini, kita bisa memperoleh format seperti di atas. Anda sendiri pasti bisa membuat fungsi serupa ini. Hanya sedikit tambahan str_replace() pada fungsi sebelumnya. Jika ada yang kurang, coba modifikasi CSS nya.

XyzWritePage(1,1000,16,"<li>[@link]</li>","<a href='?page=[@page]'>[@page]</a>");

function XyzAlignValue($value,$align){
    if($value % $align){
        $value += ($align - ($value % $align));
        return $value;
    }
    else return $value;
}
function XyzWritePage($pageStart,$itemCount,$pageCapacity,$cont,$link){
    $html='';
    $itemCount = XyzAlignValue($itemCount,$pageCapacity);
    $pageCount = 0;
    $pageCount = $itemCount / $pageCapacity;
    //write before current
    if ($pageStart-3 <= 2){
        for($p = 1; $p < $pageStart; $p++){
            //echo "$p,";
            $l = str_replace('[@page]',$p,$link);
            $html = $html . str_replace('[@link]',$l,$cont);
        }
    }
    else{
        //echo "1,...,";
        $l = str_replace('[@page]',1,$link);
        $html = $html . str_replace('[@link]',$l,$cont);
        $html = $html . str_replace('[@link]','...',$cont);
        for($p = $pageStart-3; $p < $pageStart; $p++){
            //echo "$p,";
            $l = str_replace('[@page]',$p,$link);
            $html = $html . str_replace('[@link]',$l,$cont);
        }
    }
    //echo "$pageStart";
    $html = $html . str_replace('[@link]',$pageStart,$cont);
    //write after current
    if ($pageStart+3 >= $pageCount-1){
        for($p = $pageStart+1; $p <= $pageCount; $p++){
            //echo "$p,";
            $l = str_replace('[@page]',$p,$link);
            $html = $html . str_replace('[@link]',$l,$cont);
        }
    }
    else{
        for($p = $pageStart+1; $p <= $pageStart+3; $p++){
            //echo "$p,";
            $l = str_replace('[@page]',$p,$link);
            $html = $html . str_replace('[@link]',$l,$cont);
        }
        //echo "...,$pageCount";
        $html = $html . str_replace('[@link]','...',$cont);
        $l = str_replace('[@page]',$pageCount,$link);
        $html = $html . str_replace('[@link]',$l,$cont);
    }
    return $html;

}

Demo?
Klik www.lomba.asia
Read more