2008-11-07 4 views

Respuesta

13

CURL sería perfecto, pero como no lo tiene, tendrá que ensuciarse con los enchufes. La técnica es:

  1. Abra un socket en el servidor.
  2. Enviar una solicitud HTTP HEAD.
  3. Analizar la respuesta.

Aquí está un ejemplo rápido:

<?php 

$url = parse_url('http://www.example.com/index.html'); 

$host = $url['host']; 
$port = $url['port']; 
$path = $url['path']; 
$query = $url['query']; 
if(!$port) 
    $port = 80; 

$request = "HEAD $path?$query HTTP/1.1\r\n" 
      ."Host: $host\r\n" 
      ."Connection: close\r\n" 
      ."\r\n"; 

$address = gethostbyname($host); 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
socket_connect($socket, $address, $port); 

socket_write($socket, $request, strlen($request)); 

$response = split(' ', socket_read($socket, 1024)); 

print "<p>Response: ". $response[1] ."</p>\r\n"; 

socket_close($socket); 

?> 

ACTUALIZACIÓN: He añadido unas líneas para analizar la URL

+0

Creo que es: . "Anfitrión: $ host \ r \ n \" (es decir, no% anfitrión) Pero aparte de eso que va a funcionar muy bien. –

+0

Gracias por detectar a Sean. Voy a corregir ese pequeño error tipográfico. –

+0

Debo señalar que no todos los servidores web admiten o habilitan solicitudes HEAD, incluso si la posibilidad de golpear uno es casi nula ... –

1

This page parece que tiene una muy buena configuración para descargar una página usando curl o fsockopen, y puede obtener los encabezados HTTP con cualquiera de los métodos (que es lo que realmente quiere).

Después de usar ese método, querrá marcar $ output ['info'] ['http_code'] para obtener los datos que desea.

Espero que ayude.

2

Si no estoy equivocada ninguno de los php funciones incorporadas devuelven el estado HTTP de una URL remota, por lo que la mejor opción sería utilizar sockets para abrir una conexión con el servidor, enviar una solicitud y analizar el estado de respuesta:

seudo código:

parse url => $host, $port, $path 
$http_request = "GET $path HTTP/1.0\nHhost: $host\n\n"; 
$fp = fsockopen($host, $port, $errno, $errstr, $timeout), check for any errors 
fwrite($fp, $request) 
while (!feof($fp)) { 
    $headers .= fgets($fp, 4096); 
    $status = <parse $headers > 
    if (<status read>) 
    break; 
} 
fclose($fp) 

Otra opción es utilizar una ya construir la clase de cliente HTTP en PHP que puede devolver los encabezados sin recuperar ni el contenido de la página completa, no debe ser una fuente abierta de unos pocos clases disponibles en la red ...

Cuestiones relacionadas