Alternatif untuk file_get_contents yang disabled on server by allow_url_fopen=0

cURL alternatif untuk file_get_contents melalui HTTP

Dalam versi PHP yang lebih baru, Anda akan sering mendapati bahwa mengambil file jarak jauh menggunakan fopen atau file_get_contents telah dinonaktifkan. Disini kita hadirkan sebuah fungsi http_get_contents menggunakan cURL yang bisa berfungsi sebagai solusi.

1. Fungsi http_get_contents

Ini saat ini sedang dalam proses dengan beberapa penyempurnaan dalam pipa.

function http_get_contents($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_TIMEOUT, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if(FALSE === ($retval = curl_exec($ch))) {
    error_log(curl_error($ch));
  } else {
    return $retval;
  }
}

Jika perpustakaan cURL belum diaktifkan di PHP anda akan mendapatkan fungsi error yang tidak ditemukan mencoba memanggil curl_init.

Versi masa depan akan mencakup penanganan kesalahan dan penguraian header respons HTTP yang lebih baik, untuk mendeteksi tautan yang rusak dan mengikuti pengalihan misalnya.

2. Contoh Penggunaan

Blok kode berikut memeriksa apakah alamat file dimulai dengan http dan bersyarat memanggil http_get_contents atau file_get_contents :
$file = "http://www.the-art-of-web.com/rss.xml";
$contents = preg_match("/^http/", $file) ? http_get_contents($file) : file_get_contents($file);
  
Pendekatan cURL juga bisa digunakan untuk FTP dan protokol lainnya.

3. Peningkatan Fungsi

Setelah meletakkan fungsi ini melalui langkah-langkahnya, kami menemukan beberapa perbaikan.
Pertama, Anda sekarang dapat menyediakan serangkaian pilihan tambahan untuk disertakan dalam permintaan dengan mengirimkan array asosiatif ( $ opts ), dan kedua, nilai default disertakan untuk HTTP_USER_AGENT dengan menggunakan nama domain pemanggil sebagai string User Agent.
function http_get_contents($url, $opts = [])
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  curl_setopt($ch, CURLOPT_USERAGENT, "{$_SERVER['SERVER_NAME']}");
  curl_setopt($ch, CURLOPT_URL, $url);
  if(is_array($opts) && $opts) {
    foreach($opts as $key => $val) {
      curl_setopt($ch, $key, $val);
    }
  }
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if(FALSE === ($retval = curl_exec($ch))) {
    error_log(curl_error($ch));
  } else {
    return $retval;
  }
}

Melewati string User Agent yang tidak kosong adalah praktik yang baik, dan terkadang diharuskan untuk menghindari permintaan Anda diblokir.

4. Beberapa contoh

Dalam contoh ini kita bisa mengatasi antarmuka IPv6 buggy di Facebook dengan memaksa koneksi berlangsung di atas IPv4.
<?PHP
  $endpoint = "https://graph.facebook.com/?id=" . urlencode($uri);
  $curlopts = [
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4
  ];
  $retval = http_get_contents($endpoint, $curlopts);
?>

Mengambil dan mengurai header respons Apache untuk permintaan HTTP:
<?PHP
  function read_header($ch, $string)
  {
    // function to receive and process the respons headers
  }

  $tmp = http_get_contents($url, [
    CURLOPT_HEADERFUNCTION => __NAMESPACE__ . '\read_header',
    CURLOPT_NOBODY => true
  ]);
?>

Perhatikan bahwa dalam semua kasus, konstanta CURLOPT_ * tidak boleh dikutip. Mereka bukan string, tapi sebenarnya bilangan bulat 'lama'.

5. Kode Lengkap (Bila Digabung) :

Alternatif 1
<?php
function http_get_contents($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_TIMEOUT, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if(FALSE === ($retval = curl_exec($ch))) {
    error_log(curl_error($ch));
  } else {
    return $retval;
  }
}
$getcontents = preg_match("/^http/", $url) ? http_get_contents($url) : file_get_contents($url);
echo $getcontents;
?>

6. Referensi

Post a Comment

0 Comments