[Ayuda] Comprobar si existe un archivo en un servidor ajeno

Buenas!!

Pues necesito comprobar con PHP si existe un archivo con un nombre en concreto en un servidor ajeno, por ejemplo que un usuario introduzca una URL y con el script compruebe si existe el archivo o directorio http://urldeejemplo.com/archivo.php | http://urldeejemplo.php/directorio y le diga si existe o no. He probado con file_get_contents, fopen(), sockets... y no hay manera xD

Estas son algunas pruebas que hice:
<?php

// URL a mirar si existe
$url = "http://www.comocreartuweb.com/consultas/";

if(file_get_contents($url)){
echo "La página existe";
} else {
echo "La página no existe";
}

?>
<?php

$url = "http://www.comocreartuweb.com/consultas/";

if(@fsockopen($url, 80)){
echo "La página existe";
} else {
echo "La página no existe";
}

?>

Cómo podría comprobarlo? Alguna ayuda? Gracias!!
Hola:

Lo que pasa es que todas las llamadas remotas dependen de librerías o funciones que a la vez dependen de la configuración de PHP que no se puede cambiar con ini_set. Por ejemplo, si la directiva allow_url_fopen no esta activa en el php.ini, entonces no se podrá utiliza file_get_contents para leer la URL. Por su lado, fsockopen también fallará si la directiva disable_functions esta activa en el php.ini.

La otra opción es utilizar cURL que depende de si se instaló en el servidor o no, pero generalmente esta instalada:

<?php
  if( filter_var( $_POST['url'], FILTER_VALIDATE_URL ) !== false && 
    ( $parts = parse_url( $_POST['url'] ) ) !== false ) { // Extraes las partes del enlace, pues necesitas la URL y el archivo aparte.
    $url = 'http';

    if( isset( $parts['schema'] ) )
      $url = $parts['schema'];

    $url .= '://';

    if( isset( $parts['host'] ) )
      $url .= $parts['host'];

    if( isset( $parts['port'] ) )
      $url .= ":$parts[port]";

    $curl = curl_init( $url );
    $path = isset( $parts['path'] ) ? $parts['path'] : 'index.html';
    // Si no se especificó una URL del tipo http://algo.com/ruta/contenido.algo, entonces puede que $parts['path'] no exista y por eso lo dejo como index.html, aunque puede que no exista.
    if( curl_exec( $curl ) === false )
      echo "Ocurrió un error: " . curl_error(); // Mostrará el resultado en el navegador.

    if( $curl != null )
      curl_close( $curl );
  } else {
    echo "La URL no es válida";
  }
?>

No lo he probado, así que espero que te sirva :).
Gracias por la respuesta @skaparate, he hecho un phpinfo() para revisar eso que me has dicho y efectivamente, allow_ur_fopen está desactivada y disabled_functions se encuentran los sockets. cURL sí está activado con la versión 7.15.5. El host es el gratuito de 260mb.org.

He probado el código tal cual me lo dejaste y en otra página he puesto el formulario:
<form method="post" action="url.php">
<input type="text" name="url"/>
<button type="submit">Comprobar URL</button>
</form>

Y si pongo http://www.comocreartuweb.com por ejemplo, me pone el contenido de la página, en cambio si quiero poner http://www.comocreartuweb.com/consultas me muestra el contenido de comocreartuweb.com y no del foro.

Saludos!!
Aaaah claro, pero ese es el comportamiento esperado :P. No sé que es lo que quieres, así que, asumiendo que quieras mostrar el contenido de la URL que te pasan a través del formulario, entonces el código sería este:

<?php
  if( filter_var( $_POST['url'], FILTER_VALIDATE_URL ) !== false ) { // Ahora sólo se validará que la URL sea válida
    $curl = curl_init( $_POST['url'] );
    if( curl_exec( $curl ) === false ) // Mostrará el resultado en el navegador.
      echo "Ocurrió un error: " . curl_error();

    if( $curl != null )
      curl_close( $curl );

  } else {
    echo "La URL no es válida";
  }
?>

Simple, ¿no? XD.

Hay muchas cosas que se pueden hacer con cURL. Revisa este enlace para que veas las opciones que se le pueden pasar.
Muchas gracias por la ayuda skaparate, es que nunca he usado cURL :p
He probado dejando este código para decirle al usuario si la página existe o no, pero siempre me dice que no existe aunque sí exista:
<?php

$url = $_POST["url"];
$directorio = "directorio"; // Esto es el nombre del directorio que se debe comprobar si existe en la URL ingresada por el usuario
$url = "".$url."/".$directorio."";

function comprobar($url){
if(curl_exec(curl_init($url))){
echo "El directorio existe en la página ingresada";
} else {
echo "El directorio NO existe en la página ingresada";
}
}

comprobar($url);

?>
He probado creando el directorio "directorio" en mi host y poniendo de url a comprobar la mía, entonces debería decir que sí existe pero dice que no xD
Que extraño, pues acabo de probar el mismo código pero con la URL de mi sitio y una carpeta que sé que existe y me dice que existe; sin embargo, si cambio la carpeta por una que no exista, me dice que no existe y que, además, se encontró un error 404 de no encontrado. Prueba mi código y dime si ocurre algo:

$url = 'http://nicomv.com';
// Las carpetas en mi sitio que se pueden acceder son: services, contact y mywork; micarpeta no existe :P.
$directorio = "micarpeta"; // Esto es el nombre del directorio que se debe comprobar si existe en la URL ingresada por el usuario
$url = $url . "/" . $directorio;

comprobar($url);

function comprobar($url){
	if(curl_exec(curl_init($url))){
		echo "El directorio existe en la página ingresada";
	} else {
		echo "El directorio NO existe en la página ingresada";
	}
}

Puede que el firewall este haciendo problemas; intenta desactivarlo.
Hola skaparate, de nuevo muchas gracias por responder, ahora estoy probando el código en local ya que me es más fácil configurar todo, pero seguiré con el método de cURL porque después lo subiré a un hosting.

El código funciona a la perfección, pero el problema es que muestra también la página, yo quiero sólo que se muestre la frase de que existe dependiendo de si existe o no. Cómo puedo hacerlo? En los métodos que he probado me muestra el contenido de la página igual, parece que no sé nada de PHP aún xD

Lo que me parece raro es que me haya funcionado en local pero no en el hosting.

Saludos y gracias!!
Mira lo que encontré en el manual de PHP:

function checkURL( $url ) {
  $exists = 0;
  if( filter_var( $url, FILTER_VALIDATE_URL ) ) {
    $file_headers = @get_headers( $url );
    
    if( $file_headers[0] != 'HTTP/1.1 404 Not Found' )
      $exists = 1;
  }
  
  return $exists;
}

Lo he probado y funciona con:

http://dominio/carpeta/archivo
http://dominio/carpeta/

Fuente: http://www.php.net/manual/en/function.file-exists.php#75064

Saludos y espero que te sirva :).
Pues gracias a eso he dejado el código más sencillito, así que sí me ha servidor, pero tiene una pega... si la página tiene una redirección en caso de que no exista el archivo, me dice que sí existe. Sabes de alguna manera con la que solucionar esto? Y ya habría dado por finalizado el post jejeje

Muchas gracias por toda la ayuda!!
Bueno... me has pillado, pues no tengo idea XD. Ahora estoy algo ocupado para investigarlo, pero veré si en la semana logro resolverlo y lo publico :).
De acuerdo, gracias de nuevo xD Supongo que habrá alguna manera de recibir como otra especie de cabecera que diga si la página redirecciona o no, y en caso de ser positivo realizar una acción u otra, obviamente yo también ando investigando jajaja.

Saludos y gracias!!