#php #fopen
Вопрос:
Я играю с PHP и пытаюсь запустить этот пример кода:
<?php
// $target = "http://www.example.com/";
$target = "http://www.schrenk.com/nostarch/webbots/hello_world.html";
$output = "";
// Fetch the file.
if($file_handle = fopen($target, 'r')) {
while (($buffer = fgets($file_handle, 4096)) !== false) {
$output = $output . $buffer;
}
if(!feof($file_handle)) {
$output = "Error: Unexpected fgets failn";
}
fclose($file_handle);
} else {
die("Error: fopen failedn");
}
echo $output;
?>
Я продолжаю получать эту ошибку для приведенного выше URL-адреса:
Warning: fopen(http://www.schrenk.com/nostarch/webbots/hello_world.html/): failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request in <code.php> on line 3
Однако код работает для других URL-адресов, таких как «http://www.example.com», «https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview» и т.д.
Пожалуйста, помогите мне отладить это.
Комментарии:
1. Как насчет
http://www.schrenk.com/nostarch/webbots/hello_world.html
(удаления завершающей косой черты/
в конце) ?2. Если вы откроете в браузере:
http://www.schrenk.com/nostarch/webbots/hello_world.html/
он скажет, что 404 не найден, в то времяhttp://www.schrenk.com/nostarch/webbots/hello_world.html
как откроется правильно. поэтому удалите последнее/
из URL3. Кроме того, в чем смысл
rawurlencode($target)
? Кстати, если это все еще не работаетfopen()
, это может быть запрещено для ботов.4. Позвольте мне обновить код. Кроме того, отсутствие конечной косой черты создает для меня ту же проблему. Я использовал rawurlencode в первую очередь для отладки кода. Я удалил его из примера кода.
5. @ServingQuarantineperiod Привет. Пожалуйста, попробуйте запустить Php-код, по крайней мере, вместо того, чтобы просто посещать веб-сайт.
Ответ №1:
Как и предполагалось, сайт не позволяет ботам считывать с него данные. В качестве обходного пути вы можете смоделировать пользовательский агент браузера, чтобы сайт считал, что запрос поступает из реального браузера. Кроме того, чтение с помощью fopen()
утомительно. Если вы просто хотите полностью зафиксировать ответ, curl
это гораздо лучший вариант.
Отрывок:
<?php
try{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.schrenk.com/nostarch/webbots/hello_world.html');
curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36");
$response = curl_exec($ch);
if(curl_errno($ch) !== 0){
throw new Exception(curl_error($ch));
}
curl_close($ch);
echo $response;
}catch(Exception $e){
die("Error: " . $e->getMessage());
}