Curl üzerinden php sadece alımı header

4 Cevap php

Aslında iki soru var.

(1) processing power herhangi bir azalma var mı veya php ve curl kullanarak tam sayfa alma aksine ben Yalnızca başlıkları almak durumunda bandwidth, uzak sunucuda kullanılan?

(2) sanırım, ve ben yanlış olabilir bu yana, ilk sorulardan bu cevabı YES, ben son değiştirilme tarihini veya If-Modified-Since uzaktan dosya başlığına sadece karşılaştırmak için sipariş almak için çalışıyorum olduğunu yerel olarak depolanan verilerin zaman-tarih ile o yüzden durumda da değiştirildi, yerel olarak saklayabilirsiniz. Ancak, benim komut dosyası ben bu çalıştırdığınızda, NULL olsun, bilgi bu parça getiremedik görünüyor:

class last_change {

 public last_change;

 function set_last_change() {
  $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "http://url/file.xml");
    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_FILETIME, true);
    curl_setopt($curl, CURLOPT_NOBODY, true);
  // $header = curl_exec($curl);
  $this -> last_change = curl_getinfo($header);
  curl_close($curl);
 }

 function get_last_change() {
  return $this -> last_change['datetime']; // I have tested with Last-Modified & If-Modified-Since to no avail
 }

}

Durumda $header = curl_exec($curl) uncomented olduğunu, başlık verileri görüntülenir, bunu talep ve aşağıdaki gibidir olsa bile:

HTTP/1.1 200 OK
Date: Fri, 04 Sep 2009 12:15:51 GMT
Server: Apache/2.2.8 (Linux/SUSE)
Last-Modified: Thu, 03 Sep 2009 12:46:54 GMT
ETag: "198054-118c-472abc735ab80"
Accept-Ranges: bytes
Content-Length: 4492
Content-Type: text/xml

Buna dayanarak, 'Last-Modified' döndürülür.

Peki, ben ne yanlış yapıyorum?

4 Cevap

Sen curl_getinfo() için $ başlığını geçiyoruz. Bu $curl (kıvırmak kolu) olmalıdır. Sadece filetime curl_getinfo() için ikinci parametre olarak CURLINFO_FILETIME geçerek alabilirsiniz. (Genellikle filetime o -1 olarak rapor edilecek, bu durumda kullanılamaz).

Sizin sınıf yararlı olabilecek birçok bilgi atmak olsa da, savurgan gibi görünüyor. İşte yapılabilir olabilir başka bir yol:

class URIInfo 
{
    public $info;
    public $header;
    private $url;

    public function __construct($url)
    {
        $this->url = $url;
        $this->setData();
    }

    public function setData() 
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $this->url);
        curl_setopt($curl, CURLOPT_FILETIME, true);
        curl_setopt($curl, CURLOPT_NOBODY, true);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $this->header = curl_exec($curl);
        $this->info = curl_getinfo($curl);
        curl_close($curl);
    }

    public function getFiletime() 
    {
        return $this->info['filetime'];
    }

    // Other functions can be added to retrieve other information.
}

$uri_info = new URIInfo('http://www.codinghorror.com/blog/');
$filetime = $uri_info->getFiletime();
if ($filetime != -1) {
    echo date('Y-m-d H:i:s', $filetime);
} else {
    echo 'filetime not available';
}

Sadece (a HEAD isteğine, tüm sonra, yanıt) sadece HTTP başlığını dönen bu yana Evet, yük, sunucu üzerinde daha hafif olacak. Ne kadar hafif ölçüde değişecektir.

(1) Evet. Standart bir GET isteği gibi başlıklar ve içerik aksine sadece, HTTP başlıklarını verir, çünkü (bu durumda veren konum olarak) bir HEAD isteği sunucuda çok hafiftir.

(2) basılı karşıt olarak, curl_exec() içerik döndü için aramadan önce true için CURLOPT_RETURNTRANSFER seçeneği ayarlamanız gerekir:

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

Bu da doğru sınıf çalışması yapmak gerekir.

Sen eklemeniz gerekir

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

bunun yerine baskı başlığını dönün.

Sadece başlıkları dönen sunucu üzerinde hafif olsun çalıştığı senaryo bağlıdır, ancak genellikle o olacak.

Ben de onun yerine "datetime" nin "filetime" istediğini düşünüyorum.

Neden bunun için CURL kullanabilir? Bunun için bir PHP-işlevi vardır:

$headers=get_headers("http://www.amazingjokes.com/img/2014/530c9613d29bd_CountvonCount.jpg");
print_r($headers);

aşağıdaki döndürür:

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Tue, 11 Mar 2014 22:44:38 GMT
    [2] => Server: Apache
    [3] => Last-Modified: Tue, 25 Feb 2014 14:08:40 GMT
    [4] => ETag: "54e35e8-8873-4f33ba00673f4"
    [5] => Accept-Ranges: bytes
    [6] => Content-Length: 34931
    [7] => Connection: close
    [8] => Content-Type: image/jpeg
)

Sonra bu içerik türünü almak kolay olmalıdır.

Ayrıca get_headers için = 1 biçimi ekleyebilirsiniz:

$headers=get_headers("http://www.amazingjokes.com/img/2014/530c9613d29bd_CountvonCount.jpg",1);
    print_r($headers);

Bu, aşağıdaki döndürür:

Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Tue, 11 Mar 2014 22:44:38 GMT
    [Server] => Apache
    [Last-Modified] => Tue, 25 Feb 2014 14:08:40 GMT
    [ETag] => "54e35e8-8873-4f33ba00673f4"
    [Accept-Ranges] => bytes
    [Content-Length] => 34931
    [Connection] => close
    [Content-Type] => image/jpeg
)

More reading here (PHP.NET)