2009-09-04 11 views
52

के माध्यम से PHP में पुनर्प्राप्ति वास्तव में मेरे पास दो प्रश्न हैं।हेडर केवल कर्ल

(1) वहाँ अगर मैं केवल शीर्ष लेख के रूप php और कर्ल का उपयोग कर पूरे पृष्ठ पुनः प्राप्ति के लिए विरोध को पुनः प्राप्त दूरस्थ सर्वर पर इस्तेमाल किया प्रसंस्करण शक्ति या बैंडविड्थ में कोई कमी है?

(2) के बाद से मुझे लगता है कि, और मैं गलत हो सकता है, पहले सवाल है कि इसका जवाब हाँ, मैं पिछले संशोधित तिथि या प्राप्त करने के लिए कोशिश कर रहा हूँ है-संशोधित- क्योंकि दूरस्थ फ़ाइल के हेडर केवल आदेश की तुलना करने में यह स्थानीय रूप से संग्रहीत डेटा की समय-सारिणी के साथ, इसलिए, यदि यह बदल दिया गया है, तो इसे स्थानीय रूप से स्टोर कर सकते हैं। हालांकि, मेरी स्क्रिप्ट की जानकारी के उस टुकड़े प्राप्त नहीं कर पा रहा है, मैं NULL मिलता है, जब मैं इस चलाएँ:

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 
} 

} 

मामले $header = curl_exec($curl) में uncomented, हैडर डेटा प्रदर्शित किया जाता है, भले ही मैं यह अनुरोध नहीं किया है और है निम्नानुसार:

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 

उस पर आधारित, 'अंतिम-संशोधित' वापस आ गया है।

तो, मैं गलत क्या कर रहा हूं?

उत्तर

47

आप curl_getinfo() पर $ हेडर पास कर रहे हैं। यह $curl (कर्ल हैंडल) होना चाहिए। को curl_getinfo() पर दूसरे पैरामीटर के रूप में पास करके आप केवल filetime प्राप्त कर सकते हैं। (अक्सर filetime अनुपलब्ध है, इस मामले में इसे -1 के रूप में रिपोर्ट किया जाएगा)।

आपकी कक्षा अपमानजनक प्रतीत होती है, हालांकि, बहुत सारी जानकारी फेंकना उपयोगी हो सकता है।

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); 
     curl_setopt($curl, CURLOPT_HEADER, 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'; 
} 

हाँ, लोड सर्वर पर हल्का है, क्योंकि यह केवल (, जवाब सब के बाद एक HEAD अनुरोध करने के लिए,) केवल HTTP हेडर लौटा रहा है हो जाएगा: यहाँ एक और तरीका यह किया जा सकता है। कितना हल्का काफी भिन्न होगा।

+3

उल्लेखनीय यह है कि इसके बाद के संस्करण कोड किसी भी हेडर नहीं लौटेगा है , बस जानकारी vars। शीर्षलेखों को पुनर्प्राप्त करने के लिए आपको 'curl_setopt ($ curl, CURLOPT_HEADER, true) जोड़ने की आवश्यकता है; '। हेडर पतले पाठ रूप में आते हैं और बाद में पार्स किए जाने की आवश्यकता होती है। – Lukas

15

(1) हां। एक हेड अनुरोध (जैसा कि आप इस मामले में जारी कर रहे हैं) सर्वर पर बहुत हल्का है क्योंकि यह केवल HTTP शीर्षलेख देता है, क्योंकि हेडर और मानक जीईटी अनुरोध जैसी सामग्री के विपरीत।

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

कि भी अपनी कक्षा काम सही ढंग से करना चाहिए:

(2) आप के रूप में मुद्रित करने का विरोध किया, true को CURLOPT_RETURNTRANSFER विकल्प निर्धारित करने की आवश्यकता से पहले आप curl_exec() फोन सामग्री प्रेषित की है।

4

आप

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

हैडर वापस जाने के लिए उसे प्रिंट के बजाय जोड़ने की जरूरत है।

चाहे केवल हेडर लौट रहे हों सर्वर पर हल्का है, जो चल रही स्क्रिप्ट पर निर्भर करता है, लेकिन आमतौर पर यह होगा।

मुझे लगता है कि आप "डेटाटाइम" के बजाय "फ़ाइलटाइम" भी चाहते हैं।

30

इसके लिए कर्ल का उपयोग क्यों करें?वहाँ उस के लिए एक PHP-समारोह है:

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

रिटर्न निम्नलिखित:

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 
) 

इस के बाद सामग्री प्रकार प्राप्त करने के लिए आसान होना चाहिए।

तुम भी get_headers के प्रारूप = 1 जोड़ सकते हैं:

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

यह निम्न वापस आ जाएगी:

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)

+8

बस ध्यान दें कि php दस्तावेज़ों के अनुसार यह एक हेड अनुरोध के बजाय एक GET अनुरोध करेगा, जो अक्षम लगता है। http://www.php.net/manual/en/function.get-headers.php#example-4203 – Tim

+0

@Tim, वास्तव में, उसे नहीं पता था। क्या मैं इस पोस्ट को PHP.NET पर सुझाए गए अधिक कुशल तरीके से प्रतिबिंबित करने के लिए संपादित करूंगा? मुझे पता है कि मैं अपने प्रोग्रामिंग को इस पर अनुकूलित कर दूंगा! – patrick

+3

कुकीज का उपयोग करते समय कोई हेडर प्राप्त करना चाहता है तो कर्ल आवश्यक है। – muaaz

3

आप डिफ़ॉल्ट स्ट्रीम संदर्भ सेट कर सकते हैं:

stream_context_set_default(
    array(
     'http' => array(
      'method' => 'HEAD' 
     ) 
    ) 
); 

तब का उपयोग करें:

$headers = get_headers($url,1); 

get_headers एक बार get_headers इस तरह के संकेतों का या कुकीज़ में लॉग के रूप में ट्रिगर प्रमाणीकरण दिनचर्या की तरह चरणों को छोड़ cURL तुलना में अधिक कुशल हो रहा है।

3

यहाँ CURLOPT_HEADER उपयोग करते हुए मेरे कार्यान्वयन है, तो किसी नक्शे में उत्पादन स्ट्रिंग को पार्स:

function http_headers($url){ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 

    $headers = curl_exec($ch); 

    curl_close($ch); 

    $data = []; 
    $headers = explode(PHP_EOL, $headers); 
    foreach ($headers as $row) { 
     $parts = explode(':', $row); 
     if (count($parts) === 2) { 
      $data[trim($parts[0])] = trim($parts[1]); 
     } 
    } 

    return $data; 
}; 

नमूना उपयोग:

$headers = http_headers('https://i.ytimg.com/vi_webp/g-dKXOlsf98/hqdefault.webp'); 
print_r($headers); 

Array 
(
    ['Content-Type'] => 'image/webp' 
    ['ETag'] => '1453807629' 
    ['X-Content-Type-Options'] => 'nosniff' 
    ['Server'] => 'sffe' 
    ['Content-Length'] => 32958 
    ['X-XSS-Protection'] => '1; mode=block' 
    ['Age'] => 11 
    ['Cache-Control'] => 'public, max-age=7200' 
)