Selco Cod
Selco Cod

Yazılım ve güvenlik üzerine makaleler yazan günümüz teknolojisini yakından takip eden sıradan birisi...

Twitter


cURL ve file_get_contents GZIP Sorunu

Bilindigi üzere file_get_contents bir web sitesinden veri almak icin, cURL ise hem veri almak hem de göndermek icin kullanilmaktadir. Ikisinin ortak bulustugu nokta ise de veri alma kismi. Bazen cok basit bir veriyi alicak isek cURL yerine file_get_contents kullaniyoruz, belki cURL kütüphanesine göre yavas fakat yine de kücük bir islem de is görmektedir. Herneyse ikisinin ortak sorunu da gzip ile sikistirilmis verileri alamamalidir. cURL de bu sorunun cözümü basit. bir curl_setopt tanimlamasi ile bunun önüne gecebiliyoruz. Asil kisim file_get_contents icin.
<?php
$icerik = file_get_contents('http://php.net/');
echo $icerik;
?>
Bu islem sonucunda sikistirilmis veri varsa göstermeyecektir. Bu veri sayfanin belli bir kismi da olabilir. Web siteler icin belli kisim sikistirmalar yapilabilmektedir. Veriyi sikistirmanin amaci botlari engellemek degildir aslinda amaci web site hizlandirma ve trafigi düsürmektir. Ayrica seo icinde önemli bir kisimdir. Daha önceki yazilarimda buna deginmistim. Simdi yazdigim fonksiyonlari vereyim. Veri alma icin kullanabilirsiniz.
<?php
# Selcuk Celik
# [email protected]
# selcuk.in

function _get_url_content($URL)
{
    $parametreler = array(
        'http'=>array(
            'method'=>"GET",
            'header'=>"Accept-Language: en-US,en;q=0.8rn" .
                "Accept-Encoding: gzip,deflate,sdchrn" .
                "Accept-Charset:UTF-8,*;q=0.5rn" .
                "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"
        )
    );

    $bilgiOlustur = stream_context_create($parametreler);
    $icerikAl = file_get_contents($URL, FALSE, $bilgiOlustur);

    foreach($http_response_header as $a => $b)
    {
        if(stristr($b, 'content-encoding') and stristr($b, 'gzip'))
        {
            $icerikAl = gzinflate(substr($icerikAl, 10, -8));
        }
    }

    return $icerikAl;
}
$icerik = _get_url_content('http://php.net/');
echo $icerik;
?>
User-agent olusturup veri alma islemini yapip daha sonra gelen HTTP HEADER bilgisinde veri gzip ile sikistirilmis ise acma islemini yaptik.
<?php
# Selcuk Celik
# [email protected]
# selcuk.in

function _curl($URL) {

    $c = curl_init();
    curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($c, CURLOPT_TIMEOUT, 15);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($c, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows; U; Windows NT 6.1; tr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');
    curl_setopt($c, CURLOPT_ENCODING, 'gzip');
    curl_setopt($c, CURLOPT_URL, $URL);
    $contents = curl_exec($c);

    $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
    curl_close($c);

    if ($contents) return $contents;
    else return $err;

}
$icerik = _curl('http://php.net/');
echo $icerik;
?>
Ayni islemin cURL icin olani. Bilinen cURL yapisina ek olarak CURLOPT_ENCODING olarak gzip ekledik o kadar.


Yazı Hakkında Yorumlar