ver headers example application php curl header

headers - Recuperación solo de encabezado en php a través de curl



php curl post (6)

¿Por qué usar CURL para esto? Hay una función de PHP para eso:

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

devuelve lo siguiente:

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 )

Debería ser fácil obtener el tipo de contenido después de esto.

También puede agregar el formato = 1 a get_headers:

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

Esto devolverá lo siguiente:

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 )

Más lectura aquí (PHP.NET)

En realidad tengo dos preguntas.

(1) ¿Hay alguna reducción en la potencia de procesamiento o el ancho de banda utilizado en el servidor remoto si solo obtengo encabezados en lugar de recuperación de página completa usando php y curl?

(2) Como creo, y podría estar equivocado, la respuesta a las primeras preguntas es , estoy tratando de obtener la fecha de la última modificación o el encabezado If-Modified-Since del archivo remoto solo para compararlo con la fecha y hora de datos almacenados localmente, por lo que puedo, en caso de que haya sido modificado, almacenarlo localmente. Sin embargo, mi script parece incapaz de obtener esa información, obtengo NULL , cuando ejecuto esto:

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 caso de que $header = curl_exec($curl) esté sincronizado, se muestran los datos del encabezado, incluso si no lo he solicitado y es el siguiente:

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

En función de eso, se devuelve ''Last-Modified''.

Entonces, ¿qué estoy haciendo mal?


(1) Sí. Una solicitud HEAD (como lo está emitiendo en este caso) es mucho más ligera en el servidor porque solo devuelve los encabezados HTTP, a diferencia de los encabezados y el contenido, como una solicitud GET estándar.

(2) curl_exec() establecer la opción CURLOPT_RETURNTRANSFER en true antes de llamar a curl_exec() para que se devuelva el contenido, en lugar de imprimirlo:

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

Eso también debería hacer que tu clase trabaje correctamente.


Aquí está mi implementación usando CURLOPT_HEADER, luego analizando la cadena de salida en un mapa:

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

Uso de muestra:

$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'' )


Estás pasando $ header a curl_getinfo() . Debería ser $curl (el controlador curl). Puede obtener solo el filetime de filetime pasando CURLINFO_FILETIME como el segundo parámetro a curl_getinfo() . (A menudo, el tiempo de filetime no está disponible, en cuyo caso se informará como -1).

Sin embargo, tu clase parece ser un desperdicio, desperdiciando mucha información que podría ser útil. Aquí hay otra manera en que podría hacerse:

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

Sí, la carga será más ligera en el servidor, ya que solo devuelve el encabezado HTTP (que responde, después de todo, a una solicitud HEAD ). Cuánto más ligero variará mucho.


Necesitas agregar

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

para devolver el encabezado en lugar de imprimirlo.

Si devolver solo los encabezados es más ligero en el servidor depende de la secuencia de comandos que se está ejecutando, pero generalmente lo será.

Creo que también quieres "hora de archivo" en lugar de "fecha y hora".


Puede establecer el contexto de flujo predeterminado:

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

Luego usa:

$headers = get_headers($url,1);

get_headers parece ser más eficiente que cURL una vez que get_headers salte pasos como rutinas de autenticación de desencadenantes, como solicitudes de inicio de sesión o cookies.