Skip to content

emka.web.id

menulis pengetahuan – merekam peradaban

Menu
  • Home
  • Tutorial
  • Search
Menu

Belajar PHP: Membuat layanan Short URL

Posted on May 25, 2011

URL Shortening atau layanan pemendek URL (link) adalah layanan yang memberikan sebuah link pendek dari suatu halaman web atau aplikasi web. Pertama kali dipopulerkan pada tahun 2001, dan mulai tersedia ke publik luas pertama kali oleh TinyURL pada tahun 2002. Sekarang telah lebih dari 100 macam penyedia terekspos ke publik, dan kepopulerannya kembali terangkat dengan hadirnya bit.ly pada tahun 2009 dan segera menjadi pemain utama.

Layanan pemendek URL ini sangat populer digunakan sebagai penghemat jumlah karakter pada layanan SMS atau social networking yang membatasi jumlah karakter seperti Twitter.

Belajar Membuat URL Shortening dengan PHP

Untuk membuat URL Shortening, kita dapat memanfaatkan class PHP berikut:
[sourcecode language=”php”]
<?php

/* Abstract class ShortUrl */

abstract class ShortUrl {

protected $data;

abstract protected function api();

abstract protected function execute($url);

public function getTinyUrl() {

return $this->data;
}

protected function get($url) {

$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

$data = curl_exec($ch);

curl_close($ch);

if(empty($data)) {return ‘Error retrieving data. Try again.’;}

else
{return $data;}
}

final protected function validUrl($longurl){

if(!preg_match(‘|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i’, $longurl)) {

throw new Exception("The url is not valid. Please try again.");
}
}
}

/* Concret class TinyUrl */

class TinyUrl extends ShortUrl {

private $url;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->url = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->url);

$this->execute($apiurl);
}

public function execute($url) {

$this->data = $this->get($url);
}

public function api() {

return "http://tinyurl.com/api-create.php?url=%s";
}

}

/* Concret class Bitly */

class Bitly extends ShortUrl {

private $longurl;

public function __construct($longurl,$user,$api) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl,$user,$api);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$xml = simplexml_load_string($content);

$shortUrl = $xml->results->nodeKeyVal->shortUrl;

$this->data = $shortUrl;
}

public function api() {

return "http://api.bit.ly/shorten?version=2.0.1&longUrl=%s&login=%s&apiKey=%s&format=xml";
}

}

/* Concret class Trim */

class Trim extends ShortUrl {

private $longurl;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$xml = new simpleXMLElement($content);

$shortUrl = $xml->url;

$this->data = $shortUrl;
}

public function api() {

return "http://api.tr.im/v1/trim_url.xml?url=%s";;
}

}

/* Concret class Isgd */

class Isgd extends ShortUrl {

private $longurl;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$this->data = $content;
}

public function api() {

return "http://is.gd/api.php?longurl=%s";
}

}

/* Concret class Unu */

class Unu extends ShortUrl {

private $longurl;

public function __construct($longurl) {

$this->validUrl($longurl);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$content = $this->get($url);

$this->data = $content;
}

public function api() {

return "http://u.nu/unu-api-simple?url=%s";
}

}

/* Concret class Digg */

class Digg extends ShortUrl {

private $longurl;

public function __construct($longurl,$apikey) {

$this->validUrl($longurl);

ini_set(‘user_agent’,’Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6′);

$this->longurl = urlencode($longurl);

$apiurl = sprintf($this->api(),$apikey,$this->longurl);

$this->execute($apiurl);
}

public function execute($url) {

$xml = file_get_contents($url);

$data = preg_match(‘/short_url="(.*)"/isU’,$xml,$matches);

$this->data = $matches[1];
}

public function api() {

return "http://services.digg.com/url/short/create?type=xml&appkey=%s&url=%s";
}

}

/* class Factory using method Factory*/

class Factory {

public static function create($name, $url, $user=”, $key=”) {

switch(strtolower($name)) {

case ‘bitly’:

$obj = new Bitly($url,$user,$key);

break;

case ‘tinyurl’:

$obj = new tinyUrl($url);

break;

case ‘trim’:

$obj = new Trim($url);

break;

case ‘isgd’:

$obj = new Isgd($url);

break;

case ‘unu’:

$obj = new Unu($url);

break;

case ‘digg’:

$obj = new Digg($url,$key);

break;

}//end switch

return $obj;
}

}

/* How to Usage */

/*
//Holds in variable ‘$longUrl’ the below address post
$longUrl = ‘http://www.wait-till-i.com/2009/11/02/getting-a-list-of-flickr-photos-by-location-andor-search-term-with-a-yql-open-table/’;

//$ob = Factory::create(‘bitly’,$longUrl,"thinkphp","R_0cf8415f0c3f9fcfd867ce7613e43fc7");
//$ob = Factory::create(‘tinyurl’,$longUrl);
//$ob = Factory::create(‘trim’,$longUrl);
//$ob = Factory::create(‘isgd’,$longUrl);
//$ob = Factory::create(‘unu’,$longUrl);
//$ob = Factory::create(‘digg’,$longUrl,"thinkphp","http://thinkphp.ro");

try {

$ob = Factory::create(‘bitly’,$longUrl,"thinkphp","R_0cf8415f0c3f9fcfd867ce7613e43fc7");

echo$ob->getTinyUrl();

}catch(Exception $e) {echo$e->getMessage();}

$output = highlight_file($_SERVER[‘SCRIPT_FILENAME’]);

echo$output;
*/

?>
[/sourcecode]

dan gunakan sebagai berikut:
[sourcecode language=”php”]
<?php

if($_POST[‘longUrl’] && isset($_POST[‘longUrl’]) && $_POST[‘submit’]) {

require_once(‘shortUrl.factory.class.php’);

$longUrl = $_POST[‘longUrl’];

$site = $_POST[‘shorts’];

if($site === ‘bitly’) {

$user = "thinkphp";

$apikey = "R_0cf8415f0c3f9fcfd867ce7613e43fc7";

} else if($site == ‘digg’) {

$apikey = "http://thinkphp.ro";
}

try {
$ob = Factory::create($site,$longUrl,$user,$apikey);

$shortUrl = $ob->getTinyUrl();

}catch(Exception $e) {$shortUrl = $e->getMessage();}

}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Shorten, share and track your links</title>
<link rel="stylesheet" href="http://yui.yahooapis.com/2.7.0/build/reset-fonts-grids/reset-fonts-grids.css" type="text/css">
<style type="text/css">
html,body{background:#C5C7BE;margin:0;padding:0;}

#doc{background:#fff;border:1em solid #fff;}

h1{font-family:Calibri,Arial,Sans-serif;font-size:200%;margin:0 0 .5em 0; padding:0;}

h2{font-family:Calibri,Arial,Sans-serif;font-size:150%;margin:1em 0;padding:0;font-weight: bold}

select,input{border: 1px solid #ccc;padding: 4px;margin: 4px;font-size: 40px;text-align: center}

label{margin-right: 10px}

input{margin-left: 28px}

input:focus{background: #E2FFC1}

input[id=shortUrl]{margin-left: 17px;}

form{background: #F9FFD7;padding: 30px}

#shortUrl{background: #F9FF93;padding-left: 30px;margin-top: 10px}

#shortUrl input{background: #fff}

#shortUrl label{font-weight: bold}

#ft{ color:#ccc;margin: 4px;font-size: 10px;margin-top: 20px}

#ft a { color:#ccc;}

</style>
</head>
<body>
<div id="doc" class="yui-t7">
<div id="hd" role="banner"><h1>Shorten, share and track your links</h1></div>
<div id="bd" role="main">
<div class="yui-g">

<form action="<?php echo$_SERVER[‘PHP_SELF’];?>" method="POST">

<p><label for="longUrl">Long URL</label><input type="text" name="longUrl" id="longUrl"></p><p><label for="shorts">Select service</label><select id="shorts" name="shorts"><option value="bitly">bit.ly</option><option value="tinyurl">tinyurl.com</option><option value="trim">tr.im</option><option value="isgd">is.gd</option><option value="unu">u.nu</option><option value="digg">digg.com</option></select><input type="submit" id="shortner" name="submit" value="shortUrl"></p>

</form>

<div id="shortUrl">

<label for="shortUrl">Short URL: </label><input id="shortUrl" type="text" value="<?php if(isset($shortUrl)) echo$shortUrl; ?>" >

</div>

</div>

</div>
<div id="ft" role="contentinfo"><p>Created By <a href="http://thinkphp.ro">Adrian Statescu</a></p></div>
</div>

</body>
</html>
[/sourcecode]

Install pada domain web yang singkat, misalnya test.web.id, lempar.co.cc, dll. Class PHP diatas mendukung 5 layanan pemendek URL, seperti: bitly,tinyurl,trim,is.gd,u.nu,goo.gl.

Terbaru

  • LPTNU Kritik Keras Rencana Penutupan Prodi: Kenapa Tidak Komprehensi & Berbasis Problematika Nyata?
  • Gus Rozin PWNU Jawa Tengah Setuju Cak Imin, Konflik PBNU bikin Warga Kesal dan Tidak Produktif
  • Pengamat: Prabowo Harus Benahi KAI, Aktifkan juga Jalur Kereta Lama & Baru
  • Sekjend PBNU: Jadwal Muktamar Usulan PWNU Sejalan Hasil Rapat Pleno & Rais Aam
  • PKB Desak Hukuman Maksimal Kasus Little Aresha & Evaluasi Total Sistem Penitipan Anak secara Nasional
  • PKB Usul Modernisasi Sistem Kereta dan CCTV di Kabin Masinis, Setuju?
  • Menteri PPA Arifah Fauzi Minta Maaf Soal Polemik Pindah Gerbong Wanita di KRL
  • Cara Kirim Robux Mudah di Roblox Beli Skin Shirt Preview
  • Kronologi kasus dugaan penyebaran konten asusila oleh anak anggota DPRD Kutai Barat?
  • Inilah Alasan Kenapa Gelembung Air di Luar Angkasa Bisa Jadi Eksperimen Fisika yang Keren Banget
  • Inilah Contoh Naskah Doa Upacara Hardiknas 2026 yang Syahdu dan Penuh Makna
  • Inilah 10 Peringkat SMP di Daerah Istimewa Yogyakarta Berdasarkan Hasil TKA TKAD 2025/2026 Terbaru
  • Inilah Cara Download FF Beta Versi Terbaru 2026, Lengkap Dengan Cara Daftar Advanced Server Resmi
  • Inilah Cara Menghilangkan YouTube Shorts di Beranda Biar Nggak Menghambat Scrolling Kalian!
  • Inilah Kabar Gembira Program Magang Nasional 2026, Kuota Naik Drastis Jadi 150 Ribu Peserta!
  • Inilah House of Amartha: Mengenal Bisnis Thariq Halilintar di Balik Pernikahan Mewah El Rumi dan Syifa Hadju
  • Inilah Cara Kuliah S1-S2-S3 Gratis dan Cepat Lewat Beasiswa BIB Kemenag Jalur Akselerasi 2026
  • Inilah Aturan Baru Penugasan Guru Non-ASN 2026, Nasib Kalian Ditentukan Sampai Tanggal Ini!
  • Inilah Cara Daftar Pra SPMB Banten 2026 Biar Proses Masuk Sekolah Jadi Makin Lancar
  • Inilah Rincian Biaya Jalur Mandiri Untirta 2026 Lengkap Per Fakultas dan Program Studi
  • Inilah Cara Daftar Pra SPMB Kota Semarang 2026 untuk Calon Siswa SD, Jangan Sampai Ketinggalan!
  • Inilah Cara Daftar PPOP DKI Jakarta 2026: Persiapkan Diri Kalian Jadi Calon Atlet Elite Ibu Kota!
  • Inilah Alasan Raja Ampat Disebut Surga Terakhir di Bumi dengan Biodiversitas Laut Paling Gokil di Dunia
  • Inilah Tanggapan PKB Soal KPK Usul Syarat Capres Harus Kader Partai
  • Inilah 5 Calon Ketua DPC PKB Timor Tengah Selatan dan Perubahan Aturan Seleksi yang Perlu Kalian Perhatikan
  • Inilah 51 Kode Redeem FF Terbaru 29 April 2026, Ada Gintoki Bundle dan Skin Eksklusif!
  • Inilah Profil Abdul Kadir Karding, Politikus PKB yang Resmi Dilantik Menjadi Kepala Badan Karantina Nasional!
  • Inilah 36 Kode Redeem FC Mobile Terbaru Mei 2026, Ada Trik Rahasia Dapetin Pemain OVR 119 di Event TOTS!
  • Inilah iPhone Ultra, Bocoran Ponsel Lipat Pertama Apple dan MacBook Ultra Layar Sentuh yang Siap Mengguncang Pasar!
  • Inilah Bocoran Tanggal Rilis dan Gameplay EA Sports UFC 6 yang Paling Dinantikan
  • How to Build Ultra-Resilient Databases with Amazon Aurora Global Database and RDS Proxy for Maximum Uptime and Performance
  • How to Build Real-Time Personalization Systems Using AWS Agentic AI to Make Every User Feel Special
  • How to Transform Your Windows 11 Interface into a Sleek and Modern Aesthetic Masterpiece
  • How to Understand Google’s New TPU 8 Series for Massive AI Training and Inference
  • How to Level Up Your PC Gaming Experience with the New Valve Steam Controller and Its Advanced Features
  • How to Master Excite Audio Bloom Drum Kits to Create High-Energy Rhythms in Your Digital Audio Workstation
  • How to Create Professional Animated Movies for Free Using Anijam AI and the Cedence 2.0 Video Model
  • How to Build Professional AI Designs Locally Using the Open Design Open Source Project
  • How to Sharpen Blurry Text and Recover Unreadable Documents Using Professional AI Enhancement Tools
  • How to use Claude Code for free by connecting to Open Router models
  • Apa itu Spear-Phishing via npm? Ini Pengertian dan Cara Kerjanya yang Makin Licin
  • Apa Itu Predator Spyware? Ini Pengertian dan Kontroversi Penghapusan Sanksinya
  • Mengenal Apa itu TONESHELL: Backdoor Berbahaya dari Kelompok Mustang Panda
  • Siapa itu Kelompok Hacker Silver Fox?
  • Apa itu CVE-2025-52691 SmarterMail? Celah Keamanan Paling Berbahaya Tahun 2025

©2026 emka.web.id | Design: Newspaperly WordPress Theme