60 votes

L'en-tête que l'extraction en php via curl

En fait j'ai deux questions.

(1) Est-il une réduction de la puissance de traitement ou de bande passante utilisée sur le serveur distant si je ne récupérer que les en-têtes, par opposition à une page de récupération à l'aide de php et curl?

(2) Depuis que je pense, et j'ai peut-être tort, que la réponse à la première des questions est OUI, je suis en train d'essayer d'obtenir la dernière date de modification ou Si-Modified-since-tête de fichier distant seulement afin de la comparer avec le temps-la date de l'stockés localement des données, afin que je puisse, dans le cas où il a été changé, de les stocker localement. Cependant, mon script ne semble pas en mesure de récupérer ce morceau de l'info, je reçois NULL, lorsque je l'exécute:

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
 }

}

En cas $header = curl_exec($curl) est uncomented, données d'en-tête est affiché, même si je n'ai pas demandé et est comme suit:

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

Sur cette base, 'Dernière modification' est retourné.

Donc, ce que je fais mal?

51voto

GZipp Points 3193

Vous êtes de passage à $header d' curl_getinfo(). Il convient $curl (le curl prise). Vous pouvez obtenir juste l' filetime en passant CURLINFO_FILETIME comme deuxième paramètre curl_getinfo(). (Souvent l' filetime n'est pas disponible, auquel cas il est indiqué comme -1).

Votre classe semble être un gaspillage, mais, en jetant un grand nombre d'informations qui pourraient être utiles. Voici une autre façon que l'on pourrait faire:

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';
}

Oui, la charge sera plus léger sur le serveur, car c'est seulement de retour seulement l'en-tête HTTP (répondre, après tout, à un HEAD demande). Comment beaucoup plus léger peut varier considérablement.

39voto

patrick Points 2038

Pourquoi utiliser CURL pour cela? Il y a un PHP-fonction pour que:

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

renvoie les éléments suivants:

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
)

Doit être facile à obtenir le type de contenu par la suite.

Vous pouvez également ajouter le format de l'=1 à get_headers:

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

Ce sera le retour de la suivante:

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
)

Lire plus ici (PHP.NET)

15voto

Ian Kemp Points 6408

(1) Oui. Une TÊTE de demande (que vous émettez dans ce cas) est beaucoup plus léger sur le serveur, car il renvoie uniquement les en-têtes HTTP, par opposition aux en-têtes et le contenu comme une requête GET standard.

(2) Vous devez définir la CURLOPT_RETURNTRANSFER option d' true avant vous appelez curl_exec() pour avoir le contenu retourné, par opposition à l'imprimé:

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

Cela devrait également rendre votre travail correctement.

4voto

Greg Points 132247

Vous devez ajouter

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

de retour de l'en-tête au lieu de l'imprimer.

Si le retour uniquement les en-têtes est plus léger sur le serveur dépend du script en cours d'exécution, mais il sera habituellement.

Je pense que vous aussi vous voulez "filetime" au lieu de "datetime".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X