Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Teknik untuk Menguasai cURL

by
Read Time:14 minsLanguages:

Indonesian (Bahasa Indonesia) translation by ⚡ Rova Rindrata (you can also view the original English article)

cURL adalah alat untuk mentransfer file dan data dengan sintaks URL, mendukung banyak protokol, termasuk HTTP, FTP, TELNET dan banyak lagi. Awalnya, cURL ini dirancang untuk menjadi alat baris perintah. Beruntung bagi kita, library cURL ini juga didukung dengan PHP. Dalam artikel ini, kita akan melihat beberapa fitur canggih cURL, dan bagaimana kita dapat menggunakannya dalam skrip PHP kita.

Mengapa cURL?

Memang benar bahwa ada cara lain untuk mengambil isi dari suatu halaman web. Berkali-kali, sebagian besar karena kemalasan, saya hanya menggunakan fungsi PHP sederhana bukan cURL:

Namun mereka hampir tidak memiliki fleksibilitas dan kekurangan akan penanganan kesalahan. Selain itu, ada beberapa tugas tertentu yang tidak dapat Anda lakukan, seperti berurusan dengan cookie, otentikasi, pengiriman form, upload file, dll.

cURL adalah library yang hebat yang mendukung banyak protokol, opsi, dan memberikan informasi rinci tentang permintaan URL.

Struktur Dasar

Sebelum kita beralih ke yang lebih rumit contoh, mari kita tinjau struktur dasar dari sebuah permintaan cURL di PHP. Ada empat langkah utama:

  1. Menginisialisasi
  2. Mengatur Opsi
  3. Mengeksekusi dan Mengambil Hasil
  4. Membebaskan handle cURL

Langkah #2 (yaitu panggilan curl_setopt()) akan menjadi bagian besar dari artikel ini, karena itu adalah di mana semua keajaiban terjadi. Ada daftar panjang dari pilihan cURL yang dapat diatur, yang dapat mengkonfigurasi permintaan URL secara rinci. Mungkin sulit untuk melewati keseluruhan daftar dan mencerna semuanya sekaligus. Jadi hari ini, kita hanya akan menggunakan beberapa pilihan yang lebih umum dan yang berguna dalam berbagai contoh kode.

Memeriksa Kesalahan

Secara opsional, Anda juga dapat menambahkan pengecekan error:

Harap dicatat bahwa kita perlu menggunakan "=== FALSE" untuk perbandingan, bukan "== FALSE". Karena kita perlu membedakan antara keluaran kosong vs. nilai boolean FALSE, yang menunjukkan sebuah kesalahan.

Mendapatkan Informasi

Langkah opsional yang lain adalah untuk mendapatkan informasi tentang permintaan cURL, setelah dijalankan.

Informasi berikut ini termasuk dalam array yang dikembalikan:

  • "url"
  • "content_type"
  • "http_code"
  • "header_size"
  • "request_size"
  • "filetime"
  • "ssl_verify_result"
  • "redirect_count"
  • "total_time"
  • "namelookup_time"
  • "connect_time"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "speed_download"
  • "speed_upload"
  • "download_content_length"
  • "upload_content_length"
  • "starttransfer_time"
  • "redirect_time"

Mendeteksi Pengalihan Berdasarkan pada Browser

Dalam contoh pertama ini, kita akan menulis sebuah skrip yang dapat mendeteksi pengalihan URL berdasarkan pada berbagai pengaturan browser. Misalnya, beberapa situs mengalihkan browser ponsel, atau bahkan peselancar dari negara yang berbeda.

Kita akan menggunakan opsi CURLOPT_HTTPHEADER untuk menentukan HTTP Headers yang keluar termasuk user agent string dan bahasa yang diterima. Akhirnya kita akan memeriksa untuk melihat apakah situs-situs ini berusaha untuk mengarahkan kita ke URL yang berbeda.

Pertama kita harus mengatur URL untuk menguji, diikuti oleh serangkaian pengaturan browser untuk menguji masing-masing URL tersebut terhadapnya. Kemudian kita loop melalui uji kasus dan membuat permintaan cURL untuk masing-masing.

Karena cara pengaturan opsi cURL, output yang dikembalikan hanya akan berisi HTTP headers (disimpan di $output). Dengan regex sederhana, kita bisa melihat jika ada header "Location:" disertakan.

Ketika Anda menjalankan skrip ini, Anda harus mendapatkan output seperti ini:

Melakukan POST ke URL

Pada sebuah permintaan GET, data dapat dikirim ke URL melalui "query string". Sebagai contoh, ketika Anda melakukan pencarian di Google, istilah pencarian berlokasi di bagian query string dari URL:

Anda mungkin tidak perlu cURL untuk mensimulasikannya di skrip web. Anda bisa menjadi malas dan mendapatkan url tersebut dengan "file_get_contents()" untuk menerima hasilnya.

Tapi beberapa form HTML ditetapkan untuk metode POST. Bila form ini dikirimkan melalui browser, data dikirim melalui body HTTP Request, bukan query string. Misalnya, jika Anda melakukan pencarian pada forum CodeIgniter, Anda akan mem-POST permintaan pencarian Anda ke:

Kita dapat menulis skrip PHP untuk mensimulasikan jenis permintaan URL ini. Pertama mari kita buat file untuk menerima dan menampilkan data POST. Mari kita sebut post_output.php:

Selanjutnya kita membuat skrip PHP untuk melakukan permintaan cURL:

Ketika Anda menjalankan skrip ini, Anda harus mendapatkan output seperti ini:

Ia mengirim POST ke skrip post_output.php, yang dibuang variabel $_POST, dan kami menangkap output-nya melalui cURL.

Upload File

Meng-upload file bekerja sangat mirip dengan contoh POST sebelumnya, karena semua form upload file memiliki metode POST.

Pertama-tama mari kita buat file untuk menerima permintaan tersebut dan menyebutnya upload_output.php:

Dan berikut adalah skrip yang sebenarnya melakukan upload file:

Bila Anda ingin meng-upload sebuah file, semua yang harus Anda lakukan adalah menyampaikan path file seperti variabel posting, dan menempatkan simbol @ di depannya. Sekarang ketika Anda menjalankan skrip ini, Anda harus mendapatkan output seperti ini:

Multi cURL

Salah satu fitur yang lebih canggih dari cURL adalah kemampuan untuk menciptakan sebuah handle "multi" cURL. Hal ini memungkinkan Anda untuk membuka koneksi ke beberapa URL secara bersamaan dan asinkron.

Pada permintaan cURL regular, eksekusi skrip akan berhenti dan menunggu permintaan URL untuk menyelesaikan sebelum dapat melanjutkan. Jika Anda berniat untuk mendapatkan beberapa URL, ini dapat memakan waktu yang lama, karena Anda hanya dapat meminta satu URL pada satu waktu. Kita dapat mengatasi keterbatasan ini dengan menggunakan handle multi.

Mari kita lihat pada contoh kode dari php.net:

Idenya adalah Anda dapat membuka beberapa handle cURL dan menetapkan mereka ke handle multi tunggal. Kemudian Anda dapat menunggu mereka untuk menyelesaikan mengeksekusi sementara berada di loop.

Ada dua loop utama dalam contoh ini. Pertama loop do-while berulang kali memanggil curl_multi_exec(). Fungsi ini adalah non-blocking. Ia mengeksekusi sesedikit mungkin dan mengembalikan nilai status. Selama nilai yang dikembalikan adalah konstan 'CURLM_CALL_MULTI_PERFORM', itu berarti bahwa ada pekerjaan yang masih harus dilakukan (misalnya, mengirimkan http headers ke URL.) Itu sebabnya kami terus memanggilnya sampai nilai yang dikembalikan adalah sesuatu yang lain.

Dalam loop while berikut, kita terus melanjutkan selama variabel $active adalah 'true'. Ini disampaikan sebagai argumen kedua ke panggilan curl_multi_exec(). Ini sudah diatur untuk 'true' selama ada koneksi aktif dalam handle multi. Hal berikutnya yang kita lakukan adalah memanggil curl_multi_select(). Fungsi ini adalah 'memblokir' sampai ada aktivitas koneksi, seperti menerima respon. Ketika itu terjadi, kita pergi ke lain loop do-while lainnya untuk melanjutkan mengeksekusi.

Mari kita lihat jika kita dapat membuat contoh yang bekerja milik kita sendiri, yang memiliki tujuan praktis.

Pemeriksa Link Wordpress

Bayangkan sebuah blog dengan banyak posting yang berisi link ke situs web eksternal. Beberapa dari link ini mungkin akhirnya mati setelah beberapa saat untuk berbagai alasan. Mungkin halaman sudah tidak ada lagi, atau seluruh situs web hilang.

Kita akan membangun sebuah skrip yang menganalisis semua link dan menemukan situs non-loading dan halaman 404 dan mengembalikan laporan ke kita.

Catat bahwa ini tidak akan menjadi plug-in Wordpress yang sebenarnya. Itu hanya sebuah skrip utilitas yang berdiri sendiri, dan ini adalah hanya untuk tujuan demonstrasi.

Jadi mari kita mulai. Pertama kita perlu untuk mengambil link dari database:

Pertama kami memiliki beberapa konfigurasi database, diikuti oleh sebuah array dari nama domain akan kita abaikan ($excluded_domains). Juga kita menetapkan jumlah koneksi simultan maksimum kita akan menggunakannya nanti ($max_connections). Kemudian kita terhubung ke database, mengambil posting yang berisi link, dan mengumpulkannya ke dalam sebuah array ($url_list).

Kode berikut mungkin sedikit kompleks, jadi saya akan mencoba untuk menjelaskan dalam langkah-langkah kecil.

Dan berikut ini adalah penjelasan untuk kode di atas. Angka-angka dalam daftar sesuai dengan angka-angka dalam komentar kode.

  1. Membuat handle multi.
  2. Kita akan membuat fungsi add_url_to_multi_handle() kemudian. Setiap kali ia dipanggil, ia akan menambahkan url ke handle multi. Awalnya, kita tambahkan 10 (berdasarkan $max_connections) URL untuk handle multi.
  3. Kita harus menjalankan curl_multi_exec() untuk pekerjaan awal. Selama itu mengembalikan CURLM_CALL_MULTI_PERFORM, ada pekerjaan yang harus dilakukan. Hal ini terutama untuk membuat koneksi. Ia tidak menunggu respon URL sepenuhnya.
  4. Loop utama ini berjalan selama ada beberapa kegiatan di handle multi.
  5. curl_multi_select() menunggu skrip sampai suatu kegiatan terjadi dengan permintaan URL.
  6. Lagi-lagi kita harus membiarkan cURL melakukan beberapa pekerjaan, terutama untuk pengambilan data respon.
  7. Kita memeriksa untuk info. Ada sebuah array yang dikembalikan jika permintaan URL selesai.
  8. Ada handle cURL dalam array yang dikembalikan. Kita menggunakannya untuk mengambil info pada permintaan cURL individu.
  9. Jika link mati atau habis jangka waktunya, tidak akan ada code http.
  10. Jika link adalah halaman 404, kode http akan ditetapkan ke 404.
  11. Jika tidak kita menganggap itu adalah link yang bekerja. (Anda dapat menambahkan pemeriksaan tambahan untuk kode kesalahan 500 dll...)
  12. Kami menghapus handle cURL dari handle multi sejak itu tidak lagi diperlukan, dan menutupnya.
  13. Kita sekarang dapat menambahkan url lain ke handle multi, dan lagi-lagi melakukan pekerjaan awal sebelum berpindah.
  14. Semuanya selesai. Kita dapat menutup handle multi dan mencetak laporan.
  15. Ini adalah fungsi yang menambahkan url baru ke handle multi. Variabel statis $index adalah bertambah setiap kali fungsi ini dipanggil, sehingga kami dapat terus melacak apa yang kami tinggalkan.

Saya menjalankan skrip pada blog saya (dengan beberapa link yang rusak yanng ditambahkan dengan sengaja, untuk pengujian), dan di sini adalah apa yang tampak:

Butuh hanya kurang dari 2 detik untuk melewati sekitar 40 URL. Kinerja keuntungan yang signifikan ketika berhadapan dengan set URL yang lebih besar. Jika Anda membuka sepuluh koneksi pada saat yang sama, ini dapat berjalan hingga sepuluh kali lebih cepat. Juga, Anda hanya dapat menggunakan sifat non-blocking dari handle multi cURL agar melakukan permintaan URL tanpa mengulur-ulur skrip web Anda.

Beberapa Opsi cURL Berguna Lainnya

HTTP Authentication

Jika ada otentikasi HTTP berbasis pada URL, Anda dapat menggunakan ini:

FTP Upload

PHP memiliki library FTP, tetapi Anda juga dapat menggunakan cURL:

Menggunakan Proxy

Anda dapat melakukan permintaan URL Anda melalui proxy:

Fungsi Callback

Ada kemungkinan untuk meminta panggilan cURL melalui fungsi callback selama permintaan URL, sebelum ia selesai. Misalnya, karena isi dari respon sedang didownload, Anda bisa mulai menggunakan datanya, tanpa menunggu keseluruhan download selesai.

Fungsi callback HARUS mengembalikan panjang string, yang merupakan syarat agar bekerja dengan benar.

Ketika respon URL sedang diambil, setiap kali sebuah paket data diterima, fungsi callback dipanggil.

Kesimpulan

Kami telah menjelajahi kekuatan dan fleksibilitas dari library cURL hari ini. Saya harap Anda menikmati dan belajar dari artikel ini. Pada waktu berikutnya Anda perlu membuat permintaan URL dalam aplikasi web Anda, pertimbangkan untuk menggunakan cURL.

Terima kasih dan miliki hari yang menyenangkan!

Menulis Tutorial Plus

Apakah Anda tahu bahwa Anda bisa mendapatkan hingga $600 untuk menulis tutorial PLUS dan/atau screencast untuk kami? Kami sedang mencari tutorial mendalam dan yang ditulis dengan baik tentang HTML, CSS, PHP, dan JavaScript. Jika Anda memiliki kemampuan tersebut, silakan hubungi Jeffrey di [email protected]

Harap dicatat bahwa kompensasi yang sebenarnya akan tergantung pada kualitas akhir dari tutorial dan screencast.

Write a PLUS tutorial
Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.