- file_get_contents
- Примечания
- Примеры
- Форум
- Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
- file_get_contents
- Список параметров
- Возвращаемые значения
- Ошибки
- Список изменений
- Примеры
- Примечания
- Смотрите также
file_get_contents
Данная функция идентична функции file() с той только разницей, что содержимое файла возвращается в строке, начиная с указанного смещения offset и до maxlen байтов. В случае неудачи, file_get_contents() вернёт FALSE .
Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует алгоритм ‘memory mapping’ (если поддерживается операционной системой).
Замечание: Если вы открываете URI содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode() .
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Подсказка: Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция «fopen wrappers». Смотрите более подробную информацию об определении имени файла в описании функции fopen() , а также список поддерживаемых протоколов URL в Прил. M.
При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как о «SSL: Fatal Protocol Error» в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.
Примеры
Пример 1. Получить содержание сайта через прокси с помощью file_get_contents:
$aContext = array( 'http' => array( 'proxy' => 'tcp://127.0.0.1:8080?, 'request_fulluri' => True, ), ); $cxContext = stream_context_create($aContext); $sFile = file_get_contents("http://htmlweb.ru", False, $cxContext); echo $sFile;
Пример 2. Эмулятор функции file_get_contents
if (!function_exists('file_get_contents')) < function file_get_contents($filename, $incpath = false, $resource_context = null) < if (false === $fh = fopen($filename, 'rb', $incpath)) < trigger_error('file_get_contents() failed to open stream: No such file or directory', E_USER_WARNING); return false; >clearstatcache(); if ($fsize = @filesize($filename)) < $data = fread($fh, $fsize); >else < $data = ''; while (!feof($fh)) < $data .= fread($fh, 8192); >> fclose($fh); return $data; > >
Пример 3. POST-запрос с помощью file_get_contents
function http_post ($url, $data) < $data_url = http_build_query ($data); $data_len = strlen ($data_url); return array ( 'content'=>file_get_contents ($url, false, stream_context_create (array ('http'=>array ('method'=>'POST' , 'header'=>"Connection: close\r\n". "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n". "Content-Length: $data_len\r\n" , 'content'=>$data_url )))) , 'headers'=>$http_response_header ); >
Форум
Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Всем привет. При попытке скачать страницу через php функцию file_get_contents() с сайта на https, возникает предупреждение (ошибка), связанная с сертификатом, и дальше скрипт не выполняется.
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in test.php on line 10
[openssl] openssl.cafile="%sprogdir%/modules/php/%phpdriver%/cacert.pem"
Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Обновите файл cacert.pem и вообще проверьте что он есть у вас в папке с PHP (в последних версиях он лежит тут: /userdata/config/cacert.pem), перезапуститесь. Либо у вашего хоста реально неверный или устаревший сертификат, тогда вам поможет такой код:
array( "verify_peer"=>false, "verify_peer_name"=>false, ), ); $response = file_get_contents("https://xxx", false, stream_context_create($opt)); ?>
Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Максим писал(а): ↑ 30 ноя 2021, 18:45 Обновите файл cacert.pem и вообще проверьте что он есть у вас в папке с PHP (в последних версиях он лежит тут: /userdata/config/cacert.pem), перезапуститесь. Либо у вашего хоста реально неверный или устаревший сертификат, тогда вам поможет такой код:
array( "verify_peer"=>false, "verify_peer_name"=>false, ), ); $response = file_get_contents("https://xxx", false, stream_context_create($opt)); ?>
Замена cacert.pem мне помогла при установке yii2 через composer. Но почему в самой свежей версии open server лежит устаревший сертификат?
Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
AlexPavlov1991 писал(а): ↑ 04 дек 2021, 14:40 Замена cacert.pem мне помогла при установке yii2 через composer. Но почему в самой свежей версии open server лежит устаревший сертификат?
В комплекте с Open Server лежит cacert.pem ровно той версии, какая была актуальной на момент выхода обновления OSP.
Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Заменил файл, не помогло.
А вот этот код куда надо вставить? Подскажите пожалуйста.
$opt=array(
«ssl»=>array(
«verify_peer»=>false,
«verify_peer_name»=>false,
),
);
$response = file_get_contents(«https://xxx», false, stream_context_create($opt));
?>
ещё такой вопрос антивирус может блокировать?
Re: Проблема с SSL сертификатом при попытке скачать страницу через file_get_contents
Если антивирус перехватывает и по пути проверяет зашифрованный трафик, то он подменяет при этом сертификаты на свои. В таком случае добавьте руками в cacert.pem корневой сертификат от антивируса, как это сделать — обратитесь к производителю антивируса за инструкциями и сертификатом в формате PEM.
Возможно, антивирус позволяет добавить в исключения проверку трафика отдельных процессов, в таком случае добавьте апач (в случае апача) или php-cgi.exe (в случае nginx)
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