Menggunakan cURL dan libcurl dengan PHP

Jika Anda belum pernah mendengar cURL:

cURL (dibaca: si URL) singkatan dari Client URL dan dikembangkan oleh Daniel Stenberg pada tahun 1998 sebagai alat bantu command line untuk transfer files dengan sintaks URL melalui bermacam-macam protokol (FTP, HTTP, HTTPS, SCP, SFTP, TELNET, LDAP, dsb). Sedangkan libcurl adalah library portable yang menyediakan interface (untuk berbagai bahasa pemrograman, seperti Perl, Python, PHP, dsb) terhadap fungsionalitas cURL. Contoh menggunakan cURL lewat CLI (Command Line Interface) untuk me-retrieve (mendapatkan file HTML) sebuah halaman web:

$ curl -L google.com

Parameter -L menyebabkan cURL mengikuti halaman redirect (sebagaimana google.com akan meredirect ke google.co.id jika dari IP Indonesia). Contoh lainnya adalah mempost data (yang biasanya kita lakukan melalui form):

$ curl -d "author=gedex&email=gedex@dudu.lz&comment=test&comment_post_ID=5 \

http://gedex.web.id/wp-comments-post.php

Perintah di atas akan mempost sebuah komentar di halaman WordPress saya untuk postingan dengan ID = 5. Parameter -d menyebakan cURL menggunakan metode POST dengan data yang dipost harus dalam encoding url. Nah bisa kita lihat manfaat cURL kan? Kita bisa memfungsikan cURL sebagai client (browser). Bahkan lebih dari itu, kita bisa menggunakan cURL untuk membuat webspider (layaknya googlebot). Binding libcurl untuk PHP juga sudah tersedia. Jika Anda menggunakan PHP versi 4.0.2 ke atas, maka fungsi-fungsi cURL sudah ada. Untuk memastikan fungsi cURL sudah ada, bisa di cek lewat phpinfo(). Saya menggunakan PHP v5.2.5 dan libcurl yang terinstall adalah versi 7.16.0. Pada contoh di atas, kita bisa me-retrieve sebuah halaman web dan mempost data menggunakan cURL berbasis CLI. Lalu bagaimana menggunakannya dalam PHP?

Langkah awal menggunakan cURL dalam PHP adalah menginisialisasi sebuah session (atau disebut juga membuat cURL resource), yaitu dengan:

<?php
  $ch = curl_init(); //buat resource cURL
?>

Setelah sebuah resource cURL terbentuk, curl_init() akan memberikan penangan (handle) berupa fungsi-fungsi untuk meset berbagai opsi (curl_setopt()), untuk mulai menjalankan cURL sesuai dengan opsi yang diset (curl_exec()), dan kemudian menutup session dari resource yang dibentuk tersebut (curl_close()). Misal kita ingin mendapatkan halaman http://gedex.web.id/, maka kita bisa menggunakan fungsi curl_setopt():

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL
  curl_setopt($ch, CURLOPT_URL, "http://gedex.web.id/");
?>

Setelah itu kita bisa mendapatkan halamannya dengan memanggil fungsi curl_exec(), yang secara otomatis (defaultnya) akan mencetak halaman tersebut.

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL
  curl_setopt($ch, CURLOPT_URL, "http://gedex.web.id/");

  //dapatkan halaman URL dan berikan (cetak) ke browser
  curl_exec($ch);
?>

Untuk membebaskan pemakaian resource sistem, ada baiknya menutup session dari resource cURL yang telah dibuat dengan fungsi curl_close():

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL
  curl_setopt($ch, CURLOPT_URL, "http://gedex.web.id/");

  //dapatkan halaman URL dan berikan (cetak) ke browser
  curl_exec($ch);

  //tutup resource cURL
  curl_close($ch);
?>

Pada contoh di atas, output halamannya langsung dicetak setelah memanggil fungsi curl_exec($ch). Agar output dikembalikan dari fungsi curl_exec() (sehingga bisa ditampung ke sebuah variabel untuk pemrosesan lainnya) tanpa langsung mencetak, kita perlu menset CURLOPT_RETURNTRANSFER ke true. Contohnya:

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL dan opsi RETURNTRANSFER
  curl_setopt($ch, CURLOPT_URL, "http://gedex.web.id/");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

  //dapatkan halaman URL dan berikan ke variabel $output
  $output = curl_exec($ch);

  //tutup resource cURL
  curl_close($ch);

  //ganti kata 'gedex' dengan 'dini'
  $output = str_replace('gedex', 'dini', $output);

  //cetak output
  echo $output;
?>

Pada contoh di atas, halaman web (file HTML) tidak langsung dicetak setelah pemanggilan curl_exec($ch), tapi di berikan ke variabel $output yang selanjutnya digunakan untuk mengganti kata ‘gedex’ menjadi kata ‘dini’. Nah, inilah salah satu opsi yang tersedia dari curl_setopt(). Masih ada banyak lagi opsi curl_setopt yang tersedia. Tulisan kali ini tidak akan membahas semua opsi yang tersedia, tetapi hanya sebagian opsi yang menarik dan sering digunakan. Opsi pertama yang menarik adalah CURLOPT_FOLLOWLOCATION. Coba tengok kembali contoh di atas (penggunaan cURL dengan CLI dengan parameter -L). Apabila opsi CURLOPT_FOLLOWLOCATION diset ke true, cURL akan mengikuti redirect (pengalihan) saat mencoba mendapatkan file. Misal saat cURL mencoba mendapatkan halaman (file HTML) http://google.com dan halaman index google.com meredirect ke http://google.co.id, cURL secara otomatis mengikuti dan mendapatkan halaman http://google.co.id. Jika Anda familiar dengan beberapa CMS berbasis PHP, ada beberapa file yang tidak bisa akses secara langsung melalui URL dan jika diakses akan diredirect ke file PHP lainnya. Biasanya file tersebut menggunakan fungsi header("Location: http://domain/file_lainnya"). Nah, cURL akan mengikuti redirect ke file_lainnya. Nah contoh penggunaannya:

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL dan opsi FOLLOWLOCATION
  curl_setopt($ch, CURLOPT_URL, "http://www.google.com");
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

  //dapatkan halaman URL
  curl_exec($ch);

  //tutup resource cURL
  curl_close($ch);
?>

Dua opsi yang berkaitan dengan opsi CURLOPT_FOLLOWLOCATION adalah CURLOPT_MAXREDIRS dan CURLOPT_AUTOREFERER. Opsi CURLOPT_MAXREDIRS digunakan untuk menentukan banyaknya redirect yang dapat dilalui oleh cURL. Jika kita mensetnya dengan nilai 3, maka setelah 3x redirect cURL tidak akan mengikuti redirect selanjutnya. Penggunaan opsi CURLOPT_AUTOREFERER yang diset ke true akan menyebabkan cURL menambahkan Referer header disetiap redirect. Pada contoh di atas (parameter -d dengan CLI), cURL dapat digunakan untuk mem-post data layaknya kita menginput form. Kita ambil contoh lagi, kali ini halaman yang sedang Anda baca, tepatnya form komentar di bawah. Untuk mempost komentar di halaman ini menggunakan cURL, Anda perlu tahu field post yang akan ditangkap oleh server. OK, ini potongan HTML untuk form komentar:

<form action="http://gedex.web.id/wp-comments-post.php" method="post" id="commentform">
  <p><input type="text" name="author" id="author" value="" size="22" tabindex="1" />
  <label for="author"><small>Name (required)</small></label></p>

  <p><input type="text" name="email" id="email" value="" size="22" tabindex="2" />
  <label for="email"><small>Mail (will not be published) (required)</small></label></p>

  <p><input type="text" name="url" id="url" value="" size="22" tabindex="3" />
  <label for="url"><small>Website</small></label></p>

  <p><textarea name="comment" id="comment" cols="100%" rows="10" tabindex="4"></textarea></p>

  <p><input name="submit" type="submit" id="submit" tabindex="5" value="Submit Comment" />
  <input type="hidden" name="comment_post_ID" value="5" />
  </p>
</form>

Ada lima field (author, email, url, comment dan comment_post_ID) yang bisa kita post. Mari kita tulis menggunakan cURL dalam PHP. Oh iya, saya lupa menjelaskan.. Opsi untuk melakukan request dengan metode HTTP POST adalah CURLOPT_POST (harus di set ke true jika ingin mem-post data). Opsi yang terkait adalah CURLOPT_POSTFIELDS yang nilainya berupa string yang merepresentasikan data yang akan dipost. Lima field tersebut dapat diencode ke bentuk URL menjadi:

$data = author=gedex&email=gedex@dudu.lz&url=http://gedex.web.id&comment=testing post data in string using cURL&comment_post_ID=5
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Atau bisa juga dengan menggunakan array:

$data = array('author' => 'gedex', 'email' => 'gedex@dudu.lz', 'url' => 'http://gedex.web.id', 'comment' => 'testing post data in array using cURL', 'comment_post_ID' => '5');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Nah untuk mempost data (memberi komentar di halaman ini) menggunakan cURL, kodenya kurang lebih seperti ini:

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL dan opsi FOLLOWLOCATION
  curl_setopt($ch, CURLOPT_URL, "http://gedex.web.id/wp-comments-post.php");
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

  //set opsi post dan data post
  $data = array('author' => 'gedex', 'email' => 'gedex@dudu.lz', 'url' => 'http://gedex.web.id', 'comment' => 'testing post data in array using cURL', 'comment_post_ID' => '148');
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

  //post data
  curl_exec($ch);

  //tutup resource cURL
  curl_close($ch);
?>

Opsi lainnya adalah CURLOPT_CONNECTTIMEOUT yang digunakan untuk menentukan seberapa cURL harus menunggu saat mencoba terhubung. Nilainya bertipe integer yang merepresentasikan banyaknya waktu dalam satuan detik. Jika CURLOPT_CONNECTTIMEOUT diset, nilainya perlu diperhatikan. Karena jika diset terlalu kecil dapat menyebabkan request gagal (tidak sempat terjadi) dan jika diset terlalu tinggi (misal 1000 atau 0 untuk tak hingga) dapat menyebabkan skrip PHP menjadi crash. Opsi yang terkait dengan opsi ini adalah CURLOPT_TIMEOUT, yang digunakan untuk menentukan berapa lama eksekusi request cURL. Jika kita set nilainya terlalu kecil dapat menyebabkan halaman yang lambat loadingnya menjadi tidak lengkap tertangkap cURL. Opsi lainnya adalah CURLOPT_USERAGENT, yang dapat kita gunakan untuk menset string user-agent kita saat me-request, misalnya:

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL dan opsi lainnya
  curl_setopt($ch, CURLOPT_URL, "http://www.useragent.org/");
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_USERAGENT, 'gedex web spider/1.0');

  //crawl URL
  curl_exec($ch);
?>

Ada banyak opsi lainnya seperti CURLOPT_BINARYTRANSFER, CURLOPT_FTPAPPEND, CURLOPT_HEADER, CURLOPT_PUT, CURLOPT_UPLOAD, dsb. Semuanya bisa Anda baca di manual curl_setopt.

Selain fungsi curl_setopt(), fungsi lainnya yang cukup berguna adalah curl_getinfo(). Fungsi curl_getinfo() digunakan untuk mendapatkan berbagai macam informasi mengenai halaman yang telah diakses dan juga mengenai akses (request) itu sendiri. Fungsi ini menerima parameter berupa resource cURL dan parameter setelahnya adalah opsi yang berupa konstanta untuk mendapatkan informasi tertentu. Jika hanya parameter awal saja maka nilai yang diberikan oleh fungsi ini berupa array berupa informasi request terakhir. Contohnya:

<?php
  $ch = curl_init(); //buat resourcce cURL

  //set opsi URL dan opsi lainnya
  curl_setopt($ch, CURLOPT_URL, "http://www.gedex.web.id/");
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_FILETIME, true);

  $outout = curl_exec($ch);

  //cetak info
  echo <pre>
  print_r (curl_getinfo($ch));
  echo </pre>
?>

Informasi yang didapat adalah mengenai request terakhir yang terjadi, seperti jumlah waktu yang dibutuhkan, content-type, ukuran header dsb. Saya menset CURLOPT_FILETIME ke true agar curl_getinfo() memberikan output mengenai waktu modifikasi dari dokumen yang diakses. Berikut output yang diberikan:

Array
(
    [url] => http://gedex.web.id/wp-login.php?redirect_to=%2Fwp2.5%2Fwp-admin%2F
    [content_type] => text/html; charset=UTF-8
    [http_code] => 200
    [header_size] => 922
    [request_size] => 164
    [filetime] => 1210067015
    [ssl_verify_result] => 0
    [redirect_count] => 1
    [total_time] => 15.346
    [namelookup_time] => 0
    [connect_time] => 0
    [pretransfer_time] => 0
    [size_upload] => 0
    [size_download] => 1886
    [speed_download] => 122
    [speed_upload] => 0
    [download_content_length] => 1886
    [upload_content_length] => 0
    [starttransfer_time] => 2.119
    [redirect_time] => 13.227
)

Setelah melihat beberapa dasar penggunaan fungsi cURL, mari kita buat skrip sederhana yang lebih berguna:

  1. Pengecek ada tidaknya halaman. Saat kita melakukan request ke server untuk mengakses suatu file / dokumen, server akan merespon dengan respon code yang mengindikasikan status dokumen yang direquest (200 jika OK, 404 jika tidak ketemu, dsb). Anda bahkan bisa mengembangkannya lebih jauh, yaitu apakah dokumennya diredirect, butuh autorisasi, dsb. Kali ini saya hanya menggunakan response code 404 yang mengindikasikan ada atau tidak adanya dokumen.
    <?php
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "http://somewhere.com/gak/ada");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
      $output = curl_exec($ch);
    
      $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
      echo $resposnse_code == 404 ? "Halaman tidak ketemu" : $output
    
    ?>
  2. Pengecek link. Anda sering menambah link blogroll? Biasanya di blog terdapat beberapa link blogger sejawat lainnya. Nah terkadang blogger sejawat ini tanpa kita ketahui mengganti link blognya dan link yang lama dibiarkan sehingga menjadikan link di blog kita broken. Nah cURL dapat dimanfaatkan untuk mengecek daftar link tersebut.
    <?php
      //daftar link
      $links = [ "http://gedex.web.id", "http://dudulz.wordpress.com", "http://gak.ada/domain"];
      for($i = 0; $i < count($links); $i++) {
        //set opsi untuk setiap resource cURL
        curl_setopt($ch, CURLOPT_URL, $links[$i]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    
        curl_exec($ch);
        $results[$links[$i]] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
      }
      echo "<pre>";
      print_r($results);
      echo "</pre>";
    ?>
  3. Posting blog WordPress melalui XML-RPC.
    <?php
      $blog_id  = "1";
      $username = "admin";
      $password = "123456";
    
      $post_title      = "test post";
      $post_content     = "test post lewat xmlrpc menggunakan cURL";
    
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "http://localhost/wp2.5/xmlrpc.php");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
      $header    = array("Content-Type: text/xml");
      curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    
      $data = "<?xml version='1.0'?>
      <methodCall>
      <methodName>metaWeblog.newPost</methodName>
      <params>
        <param><value><int>$blog_id</int></value></param>
        <param><value><string>$username</string></value></param>
        <param><value><string>$password</string></value></param>
        <param><value><struct>
          <member>
            <name>title</name>
            <value><string>$post_title</string></value></member>
          <member>
            <name>description</name>
            <value><string>$post_content</string></value></member>
        </struct></value></param>
        <param><value><boolean>1</boolean></value></param>
      </params>
      </methodCall>";
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    
      $output = curl_exec($ch);
      echo "pre" . htmlentities($output) . "pre";
  4. Posting komentar di blog wordpress (dijelaskan di atas).
  5. Banyak contoh sederhana lainnya yang diberikan di kumpulan contoh PHP/cURL.

Banyak aplikasi web berbasis PHP yang memanfaatkan cURL, diantaranya adalah:

  • Beberapa CMS menggunakan cURL untuk library mereka (seperti: Geeklog, Habari, Joomla, MediaWiki, dsb).
  • Snoopy – PHP Class yang mensimulasikan browser.
  • phpMyProxy – skrip sederhana Proxy dengan PHP
  • Dan masih banyak contoh aplikasi lainnya.

Nah cukup sekian penjelasan singkat mengenai cURL dan libcurl dalam PHP. Semoga berguna. Happy coding with cURL :) .

Referensi:

39 thoughts on “Menggunakan cURL dan libcurl dengan PHP

  1. bro.. gw masih bermasalah untuk cURL php ke sebuah website ni, untuk menangani sessionnya.. bisa tolong dibantu?

    ada ym ga bos?

  2. bos, klo ini maksudnya apa ya..?

    “Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set in /home/a5500030/public_html/VideoSearch/functions.php on line 39″

  3. waw.. makasih mas bwt tutorialnya

    lagi belajar curl neih…

    oh ya.. kalau mau memfilter halaman yang diambil gimana ya mas..

    misalnya, sebuah halaman hanya kita ambil di bagian tertentu saja…

    makasih

  4. Bro.. caranya supaya imagenya juga keload gimana? gw coba yang retrieve google.com trus ngikutin redirect dia, hasilnya emang keluar page google.co.id tapi tanpa image sama sekali. Gimana tuh?

  5. $buffer = curl_exec($ch); //ambil semua content url

    kalau saya ingin mengambil links nya saja gmn? dan isi buffer ketika curl_exec hanya akan berisi tag-A saja (links)?

    Jadi mungkin proses generate tag-A nya ngak via manipulasi $buffer yang sudah terisi oleh semua content url.

    Thanks…

  6. memang tutorial diatas bisa dikatakan kumplit… tapi namanya aja masih newbie walaupun bener2 kumplit tetep aja confusing :mrgreen:

    Haloo Juragan *admin* bisa dibalas komentar2 kami ?? klo perlu YM nya juga dikasih ke kita dong :D

    Mengharap Mode : ON

  7. Aku dah nyoba, di dreamweaver. tp kok muncul tulisan begini pas cUrl nya
    Fatal error: Call to undefined function curl_init() in E:\PHPCool\xampp\htdocs\pasti.php on line 2
    Apa karena versi php ku 5.xx gt?

  8. Gimana buat penanganan captcha nya??? misal kalo form dengan validasi captcha otomatis image captcha akan di prompt untuk memasukkan captcha secara manual, trus dikirim deh + kue2nya (cookies mksdudnya :D )

  9. #14
    Sepertinya sulit, memungkinkan jika ditambah proses character recognition. Bot umumnya digunakan untuk mengcrawl halaman yang bersifat publik

  10. Pingback: php-resources » Pengenalan Curl

  11. Terima kasih.. saya pertama kali belajar curl nih.. melalui penjelasan saudara, saya jadi berada di atas angin untuk mempelajari curl.

  12. wiiihhhhh keren banget artikelnya apalagi source code nya…boleh juga nih dicoba tapi biungung mulai dari mana maklum kan saya newbie…^_^

    terima kasih infonya, silakan mampir yaa ke sini dan jika mau tahu artikel menarik lainnya silakan berkunjung ke sini yaaa…

  13. helo bos saya ada lihat di website ini tutorial yang cukup menarik

    http://www.cybershade.org/modules/codebase/view/curl-proxy-site-hit-booster-4.html
    saya agak sedikit modif dan script ini saya tempatkandi website X untuk ngehit ke blog ku….jadi scritnya saya buat begini

    getPage(“http://www.myblog.com”,”202.188.2.111″,”80″);

    setelah saya liat di log yang di catat adalah IP dimana script ini saya letakkan.
    Pertanyaan saya adalah bagimana caranya agar IP yang tercatat di blog saya
    adalah IP yang membuka website X?? BUkan IP dimana saya tempatkan script diatas.
    thx

    Tapi kalau saya liat di wlog website ku yang di catat adalah IP dimana

  14. Pingback: MotekarWeb » Blog Archive » Menggunakan cURL dan libcurl dengan PHP

  15. Keren bang postingannya,,, jadi semangat buat belajar…
    Izin add blognya di blogroll saya bang, thx.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>