PHP: Получить исходный код HTML с CURL
Как я могу получить исходный код html http://www.example-webpage.com/file.html без использования file_get_contents() ? Мне нужно это знать, потому что на некоторых веб-хостах allow_url_fopen отключен, поэтому вы не можете использовать file_get_contents() . Возможно ли получить источник html файла с помощью cURL (если включена поддержка cURL)? Если да, то как? Спасибо.
3 ответа
$ch = curl_init("http://www.example-webpage.com/file.html"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); $content = curl_exec($ch); curl_close($ch);
Я бы рекомендовал это только для небольших файлов. Большие файлы читаются в целом и могут вызвать ошибку памяти. edit: после некоторого обсуждения комментариев мы выяснили, что проблема заключается в том, что servercouldnt разрешает имя хоста, а страница дополнительно содержит https-ресурс, поэтому здесь появляется ваше временное решение (до тех пор, пока ваш serveradmin не исправляет разрешение имен). то, что я сделал, просто pinging graph.facebook.com, чтобы увидеть ip-адрес, заменить имя хоста на ip-адрес и вместо этого дать заголовок вручную. это, тем не менее, делает ssl-сертификат недействительным, поэтому нам нужно подавить проверку сверстников
//$url = "https://graph.facebook.com/19165649929?fields=name"; $url = "https://66.220.146.224/19165649929?fields=name"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: graph.facebook.com')); $output = curl_exec($ch); curl_close($ch);
Имейте в виду, что адрес ip может измениться, и это источник eror. вы должны также выполнять некоторую обработку ошибок с помощью curl_error();
Работает ли он с простым текстовым файлом вместо HTML-файла? Я проверил это с простым текстовым файлом — и я получил пустую страницу.
Вы правы, закрывая завиток, не плохая идея, плохо изучите вариант использования с текстовым файлом. Мэйби, у вас есть URL для меня (потому что разницы практически нет, но может быть другая ошибка . )?
хорошо downlaoding facebook.com/robots.txt работал нормально, вы можете дать мне URL, который не работает?
попробуйте это: graph.facebook.com/19165649929?fields=name , который не работает для меня. Очевидно, что это также доступно через «http»
его https, а не http. это работает здесь с примером выше, но настройки ssl могут зависеть от версии! пожалуйста попробуйте это: var_dump (curl_error ($ ch)); перед curl_close и скажите мне, что он выводит!
поэтому ваш сервер не может разрешить IP-адрес. Вы должны связаться с администратором вашего сервера, он должен установить правильное разрешение DNS. нет ничего плохого в вашем коде. единственное решение, которое я сейчас знаю или без исправления этой проблемы с сервером, — это непосредственное получение данных с IP-адреса и отправка заголовка узла, но вам придется иметь дело с предупреждениями ssl. кстати было бы неплохо, если бы вы проголосовали за это 🙂
CURLOPT_BINARYTRANSFER больше не требуется (начиная с версии 5.1.3, которая, я надеюсь, никто не использует).
$curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); curl_close($curl);
Как говорится в документации:
Основная идея функций cURL заключается в том, что вы инициализируете сеанс cURL с помощью curl_init(),, тогда вы можете установить все свои параметры для передачи через curl_setopt(), затем вы можете выполнить сеанс с curl_exec(), а затем вы завершите сеанс, используя curl_close().
Ещё вопросы
- 1 Ошибка SDK администратора Google — метод не найден
- 0 Запуск imagecreatefrompng массива изображений, но массив только возвращает 1 изображение
- 0 preg_replace для сопоставления шаблона с любой стороны селектора
- 1 Форматировать строку даты в JavaScript
- 0 Нужна помощь в пересмотре сценария автоматической проверки
- 1 C # при остановке цикла FOR он считает остальные числа как 0
- 0 функция вызова при нажатии кнопки
- 1 Одна горячая кодировка на уровне персонажа
- 1 Как исправить непредставляемый DateTime в C #
- 1 Код для создания личности в онтологии?
- 0 MYSQL третье внутреннее объединение не работает
- 1 Адаптирование spymemcached Java-клиента GetFuture к Guava ListenableFuture
- 1 Игра Python Heads или Tails, не отображается, кроме пункта
- 0 Сравните 3 объекта и покажите 1 по указанию
- 1 Визуализация компонента с помощью concat helper
- 0 PHP API Parsehub
- 1 Преобразование поэтажных планов в иерархические графики
- 1 Kotlin абстрактный класс вторичный конструктор
- 1 Компаратор работает для моего ArrayList, но код выглядит неправильно?
- 1 Точки и квадратные скобки
- 1 Ожидание непустой строки для ошибки параметра ‘providerInvariantName’ в приложении c #, имеющем базу данных доступа
- 0 AngularJS не может получить объект авторизации из сервиса в функции разрешения
- 1 Получить IP-адрес из последней строки файла журнала, используя Regex
- 0 файл загружен в папку, но путь не сохраняется в базе данных
- 0 MySQL SELECT, если нет более новой записи
- 0 Код CodeIgniter работает в браузере, умирает в тесте phpunit: вызов неопределенного метода CI_DB_mysql_driver :: where () в (… privacy ..) users.php в строке 36
- 0 Вставить элемент в 2D вектор C ++
- 0 SQL-запрос с IF, AS и LIKE
- 0 Передача объекта и получение возвращаемого значения из вызова потока
- 0 Добавление слайд-и-анимации с угловой анимацией (нг-шоу)
- 0 Ogre3D пытается скомпилировать Tutorial Framework и продолжает получать сообщение об ошибке. Code :: Blocks
- 1 Что касается потоков в Swing GUI
- 1 Как я могу пройти и сократить объект?
- 1 Обновление данных из Vuex дает бесконечный цикл в watcher
- 0 UnknownError: unknown error: элемент не активен в точке (713, 6). Другой элемент получит щелчок:
- 0 Как вычесть две даты в php [дубликаты]
- 1 скорость анимации заголовка сворачивающейся панели инструментов
- 0 C ++ SWIG генерирует код в зависимости от Tcl
- 1 Получение позиции указания элемента из localStorage
- 0 Ionic / Angular App не читает данные JSON из API
- 0 python + opencv «загрузка dll не удалась»
- 1 Самый простой способ добавить политику конфиденциальности с моим приложением для Android
- 0 ngResource save () странное поведение
- 0 Сохраните данные JSON в текстовый файл и прочитайте его
- 0 Нужно ли закрывать соединение с пулом для каждого API в nodejs + mysql?
- 0 ng-repeat с динамическими данными json, полученными в качестве аргумента
- 1 JavaScript ES6: разделить массив на покой и завершить с деструктуризацией [дубликаты]
- 0 Yii — скачанный zip-файл поврежден
- 1 Как отложить вызов в базу данных от gwt?
- 1 Вызов метода из Native dll работает в первый раз, сбои во второй раз (из-за модулей fortran)?
file_get_contents
Данная функция похожа на функцию file() с той лишь разницей, что file_get_contents() возвращает содержимое файла в строке, начиная с указанного смещения offset и до length байт. В случае неудачи, file_get_contents() вернёт false .
Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой.
Замечание:
Если вы открываете URI, содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode() .
Список параметров
Замечание:
Можно использовать константу FILE_USE_INCLUDE_PATH для поиска файла в include path. Только помните, что если вы используете строгую типизацию, то так сделать не получится, поскольку FILE_USE_INCLUDE_PATH имеет тип int . В таком случае используйте true .
Корректный ресурс контекста, созданный с помощью функции stream_context_create() . Если в использовании особого контекста нет необходимости, можно пропустить этот параметр передав в него значение null .
Смещение, с которого начнётся чтение оригинального потока. Отрицательное значение смещения будет отсчитываться с конца потока.
Поиск смещения ( offset ) не поддерживается при работе с удалёнными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но результат будет непредсказуемым, так как функция работает на буферизованном потоке.
Максимальный размер читаемых данных. По умолчанию чтение осуществляется пока не будет достигнут конец файла. Учтите, что этот параметр применяется и к потоку с фильтрами.
Возвращаемые значения
Функция возвращает прочтённые данные или false в случае возникновения ошибки.
Эта функция может возвращать как логическое значение false , так и значение не типа boolean, которое приводится к false . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Ошибки
Будет сгенерирована ошибка уровня E_WARNING в случаях, если не удастся найти filename , задан length меньше нуля, или поиск по смещению offset в потоке завершится неудачно.
Когда file_get_contents() вызывается в каталоге, в Windows ошибка генерируется E_WARNING , а с PHP 7.4 также в других операционных системах.
Список изменений
Версия | Описание |
---|---|
8.0.0 | Параметр length теперь допускает значение null . |
7.1.0 | Добавлена поддержка отрицательных значений offset . |
Примеры
Пример #1 Получить и вывести исходный код домашней страницы сайта
Пример #2 Поиск файлов в include_path
// Если включены строгие типы, то есть объявлено (strict_types=1);
$file = file_get_contents ( ‘./people.txt’ , true );
// Иначе
$file = file_get_contents ( ‘./people.txt’ , FILE_USE_INCLUDE_PATH );
?>?php
Пример #3 Чтение секции файла
// Читаем 14 символов, начиная с 21 символа
$section = file_get_contents ( ‘./people.txt’ , FALSE , NULL , 20 , 14 );
var_dump ( $section );
?>?php
Результатом выполнения данного примера будет что-то подобное:
Пример #4 Использование потоковых контекстов
// Создаём поток
$opts = array(
‘http’ =>array(
‘method’ => «GET» ,
‘header’ => «Accept-language: en\r\n» .
«Cookie: foo=bar\r\n»
)
);
?php
$context = stream_context_create ( $opts );
// Открываем файл с помощью установленных выше HTTP-заголовков
$file = file_get_contents ( ‘http://www.example.com/’ , false , $context );
?>
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen() . Смотрите также список поддерживаемых обёрток URL, их возможности, замечания по использованию и список предопределённых констант в разделе Поддерживаемые протоколы и обёртки.
При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify . PHP сообщит об этом как «SSL: Fatal Protocol Error» в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обёртки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.
Смотрите также
- file() — Читает содержимое файла и помещает его в массив
- fgets() — Читает строку из файла
- fread() — Бинарно-безопасное чтение файла
- readfile() — Выводит файл
- file_put_contents() — Пишет данные в файл
- stream_get_contents() — Читает оставшуюся часть потока в строку
- stream_context_create() — Создаёт контекст потока
- $http_response_header