Me estoy enseñando un poco de raspado básico y descubrí que a veces las URL que introduzco en mi código devuelven 404, lo que pega todo el resto de mi código.
Por lo tanto, necesito una prueba en la parte superior del código para verificar si la URL devuelve 404 o no.
Esto parecería una tarea bastante directa, pero Google no me da ninguna respuesta. Me preocupa que estoy buscando las cosas equivocadas.
Un blog me recomendó usar esto:
$valid = @fsockopen($url, 80, $errno, $errstr, 30);
y luego prueba para ver si $ válido si está vacío o no.
Pero creo que la URL que me está dando problemas tiene una redirección, por lo que $ valid está vacío para todos los valores. O tal vez estoy haciendo algo más mal.
También examiné una "solicitud principal" pero aún no he encontrado ningún ejemplo de código real con el que pueda jugar o probar.
Sugerencias? ¿Y de qué se trata el rizo?
fuente
curl_setopt($handle, CURLOPT_NOBODY, true);
antes de ejecutarcurl_exec
Si estás ejecutando php5 puedes usar:
Alternativamente, con php4, un usuario ha contribuido lo siguiente:
Ambos tendrían un resultado similar a:
Por lo tanto, puede verificar si la respuesta del encabezado fue correcta, por ejemplo:
Códigos y definiciones del W3C
fuente
get_headers($https_url,1,443);
estoy seguro de que funcionará aunque no esté en laget_headers()
función estándar . Siéntase libre de probarlo y responder con un estado para ello.Con el código de strager, también puede consultar el CURLINFO_HTTP_CODE para ver otros códigos. Algunos sitios web no informan un 404, sino que simplemente redirigen a una página 404 personalizada y devuelven 302 (redireccionar) o algo similar. Utilicé esto para verificar si un archivo real (por ejemplo, robots.txt) existía en el servidor o no. Claramente, este tipo de archivo no causaría una redirección si existiera, pero si no fuera así, redirigiría a una página 404, que como dije antes puede no tener un código 404.
fuente
408 Request Timeout
, no un404
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, FALSE);
Como sugiere Strager, considera el uso de cURL. También puede estar interesado en configurar CURLOPT_NOBODY con curl_setopt para omitir la descarga de toda la página (solo desea los encabezados).
fuente
Si está buscando una solución más fácil y la que puede probar de una vez, vaya a php5 do
fuente
Encontré esta respuesta aquí :
Básicamente, utiliza el método "obtener contenido del archivo" para recuperar la URL, que rellena automáticamente la variable de encabezado de respuesta http con el código de estado.
fuente
Esto le dará verdadero si la url no devuelve 200 OK
fuente
anexo; probó esos 3 métodos considerando el rendimiento.
El resultado, al menos en mi entorno de prueba:
Curl gana
Esta prueba se realiza bajo la consideración de que solo se necesitan los encabezados (noBody). Pruébate:
fuente
Como pista adicional a la gran respuesta aceptada:
Al usar una variación de la solución propuesta, recibí errores debido a la configuración de php 'max_execution_time'. Entonces, lo que hice fue lo siguiente:
Primero configuré el límite de tiempo a un número mayor de segundos, al final lo configuré nuevamente al valor definido en la configuración de php.
fuente
fuente
Aquí hay una pequeña solución.
En su caso, puede cambiar
application/rdf+xml
a lo que sea que use.fuente
Esta función devuelve el código de estado de una URL en PHP 7:
Ejemplo:
fuente
También puede usar este código para ver el estado de cualquier enlace:
fuente
esto es solo una porción de código, la esperanza funciona para ti
fuente
¡Aquí hay un camino!
Este simple script simplemente hace una solicitud a la URL de su código fuente. Si la solicitud se completa con éxito, generará "¡URL existe!". Si no, generará "¡La URL no existe!".
fuente