Estoy tratando de obtener una cadena de dominios cruzados, pero en algún momento o algún sitio web da un error 403 Forbidden . Entonces, para protegerme de recibir un error, estoy tratando de incluir la if statement , si el sitio uno obtiene un error al obtener la cadena, entonces se moverá a otra parte y tomará la cadena del sitio dos.
Error :
Advertencia: file_get_contents( https://www.example.com ): No se pudo abrir la transmisión: ¡La solicitud HTTP falló! HTTP/1.1 403 Prohibido
Código:
$siteone = file_get_contents("https://www.example.com"); $sitetwo = file_get_contents("https://www.example.net"); if ($siteone === false) { $error = error_get_last(); echo $sitetwo; } else { echo $siteone; } Entonces, aquí, si example.com da 403 error , automáticamente ignora example.com y obtiene una cadena de example.net .
También probé try and catch pero no funcionó. ¡¡Por favor ayuda!!
En lugar de usar file_get_contents o quedar atrapado escribiendo funciones usando get_headers etc. para verificar el código de respuesta antes de intentar capturar los contenidos, sugiero usar cURL. Dentro de su solicitud de curl, puede inspeccionar el código de respuesta HTTP directamente y la ventaja adicional es que automáticamente tiene el contenido disponible si la solicitud es exitosa.
$errors = $valid = $content = array(); $break_on_success = false; $urls=array( 'https://www.bogus.com', 'https://stackoverflow.com/', 'https://developer.mozilla.org', 'https://developer.mozilla.org/en-US/admin', 'https://stackoverflow.com/questions/70518330/if-statement-with-file-get-contents-to-avoid-403-error', 'https://www.gumtree.com/', 'https://httpstat.us/307', 'https://httpstat.us/403', 'https://httpstat.us/401', 'https://www.farcebook.com' ); foreach( $urls as $url ){ $ch=curl_init( $url ); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true ); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 ); curl_setopt( $ch, CURLOPT_CAINFO, $cacert ); curl_setopt( $ch, CURLOPT_CAPATH, $cacert ); $response=curl_exec( $ch ); if( !curl_errno( $ch ) ){ $status=curl_getinfo( $ch, CURLINFO_RESPONSE_CODE ); if( $status==200 ){ $valid[]=$url; $content[ $url ]=$response; if( $break_on_success )break; }else{ $errors[ $status ]=$url; } } $ch=null; } printf('<pre>%s</pre>',print_r($valid,true)); printf('<pre>%s</pre>',print_r($errors,true));Esto generará la siguiente salida:
Array ( [0] => https://stackoverflow.com/ [1] => https://developer.mozilla.org [2] => https://stackoverflow.com/questions/70518330/if-statement-with-file-get-contents-to-avoid-403-error [3] => https://www.gumtree.com/ [4] => https://httpstat.us/307 [5] => https://www.farcebook.com ) Array ( [404] => https://developer.mozilla.org/en-US/admin [403] => https://httpstat.us/403 [401] => https://httpstat.us/401 ) Las direcciones URL enumeradas en la primera matriz se han procesado y no devuelven un código de estado http falso, mientras que las de la segunda se pueden ignorar. Si, en lo anterior, establece $break_on_success=true; el código se detendría una vez que se haya encontrado la primera URL para devolver una buena respuesta. El contenido HTML de cada URL se almacena dentro de la matriz $content y se puede procesar posteriormente.
Mencioné usar get_headers para lograr este objetivo. Si bien es posible, existen varias trampas que uno podría encontrar y cualquier código podría terminar siendo más complicado de lo necesario.