- file_get_contents
- Список параметров
- Возвращаемые значения
- Ошибки
- Список изменений
- Примеры
- Примечания
- Смотрите также
- PHP: file_get_contents timeout.
- Changing the default timeout setting.
- Per-request.
- Warning about script timeouts.
- Conclusion.
- Does file_get_contents() have a timeout setting?
- Solution 2
- Solution 3
- Solution 4
- Solution 5
- Таймер file_get_contents php?
- Войдите, чтобы написать ответ
- Как сохранить старое значение для input type file?
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
PHP: file_get_contents timeout.
This is a short guide on how to set the timeout for PHP’s file_get_contents function. In this post, I will show you how to change this timeout setting on both a default and per-request basis.
Changing the default timeout setting.
If you would like to modify the default timeout setting for ALL file_get_contents requests, then you will need change the default_socket_timeout configuration setting in your php.ini file. This value represents the timeout in seconds for all socket-based streams.
The default value of default_socket_timeout is set to 60 seconds. As a result, HTTP requests will fail if they are not completed within that time frame.
To find out what your current default value is, you can use the init_get function like so:
//Retrieve and print out the value of default_socket_timeout. echo ini_get('default_socket_timeout');
In my case, the above piece of code printed out the integer 60. i.e. 60 seconds.
To change this setting, you can modify the directive in your php.ini file. Below is an example of the timeout value being set to 120 seconds:
default_socket_timeout = 120
If you are unable or unwilling to change your php.ini file, then you can use the init_set function, which allows you to set configuration values on the fly:
//Set default_socket_timeout to 180 seconds. ini_set('default_socket_timeout', 180);
In the above example, I used the ini_set function to change default_socket_timeout to 180 seconds. i.e. 3 minutes.
Per-request.
If you would like to increase the timeout for one particular HTTP request, then you can use PHP’s stream_context_create function like so:
//Create a custom stream context that has a HTTP timeout //of 120 seconds. $streamContext = stream_context_create( array('http'=> array( 'timeout' => 120, //120 seconds ) ) ); //Pass this stream context to file_get_contents via the third parameter. $result = file_get_contents('http://localhost/example/', false, $streamContext);
In the code above, we created a custom stream context using the stream_context_create function. This stream context has a HTTP timeout of 120 seconds. We then passed this stream context in as the third parameter to file_get_contents.
Warning about script timeouts.
You will also have to be wary of the fact that PHP scripts have a maximum execution time. i.e. If your request takes 180 seconds to complete, but your maximum execution time is set to 120, then the PHP script will throw a fatal error. To avoid this, you will also have to use the set_time_limit function:
//Set max execution time of the script to 190 seconds. set_time_limit(190);
In the snippet above, we set the maximum execution time to 190 seconds.
Conclusion.
I would recommend that you use the stream context method, as increasing the timeout for ALL requests made via file_get_contents is a tad bit overkill. The main question to ask yourself here is this: Should all of my HTTP requests be given more than 60 seconds to complete?
In my opinion, the answer is no.
Does file_get_contents() have a timeout setting?
The default timeout is defined by default_socket_timeout ini-setting, which is 60 seconds. You can also change it on the fly:
ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes
Another way to set a timeout, would be to use stream_context_create to set the timeout as HTTP context options of the HTTP stream wrapper in use:
$ctx = stream_context_create(array('http'=> array( 'timeout' => 1200, //1200 Seconds is 20 Minutes ) )); echo file_get_contents('http://example.com/', false, $ctx);
Solution 2
As @diyism mentioned, «default_socket_timeout, stream_set_timeout, and stream_context_create timeout are all the timeout of every line read/write, not the whole connection timeout.» And the top answer by @stewe has failed me.
As an alternative to using file_get_contents , you can always use curl with a timeout.
So here’s a working code that works for calling links.
$url='http://example.com/'; $ch=curl_init(); $timeout=5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $result=curl_exec($ch); curl_close($ch); echo $result;
Solution 3
Yes! By passing a stream context in the third parameter:
Here with a timeout of 1s:
file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));
method header user_agent content request_fulluri follow_location max_redirects protocol_version timeout
Socket FTP SSL CURL Phar Context (notifications callback) Zip
Solution 4
It is worth noting that if changing default_socket_timeout on the fly, it might be useful to restore its value after your file_get_contents call:
$default_socket_timeout = ini_get('default_socket_timeout'); . ini_set('default_socket_timeout', 10); file_get_contents($url); . ini_set('default_socket_timeout', $default_socket_timeout);
Solution 5
For me work when i change my php.ini in my host:
; Default timeout for socket based streams (seconds) default_socket_timeout = 300
Таймер file_get_contents php?
555.555.5.5 может долго не отвечать, подвесить соединение, может быть не доступным.
есть файл callback.php который делает file_get_contents req_callback.php
Могу ли я в req_callback.php прописать условие которое оборвет выполнение скрипта через 5 сек чтоб callback.php смог получить ответ что все плохо и сервер 555.555.5.5 не отдал контент в течении 5 сек ?
$ctx = stream_context_create(array('http'=> array( 'timeout' => 1200, //1200 Seconds is 20 Minutes ) )); echo file_get_contents('http://example.com/', false, $ctx);
Если данные не нужны прямо «здесь и сейчас», то можно
1. записать в табличку задания, по каким адресам нужно что-то скачать.
2. запускаем периодически менеджер, который проверяет есть ли незавершенные задания.
2.а если есть, запускаются воркеры, которые пишут в табличку свой PID и время когда они взяли задание в работу
2.б если менеджер видит, что времени прошло слишком много — он килляет воркер по PID и перезапускает.
2.в если воркер отработал нормально — сохраняет данные на диск, пишет время завершения. берет следущее задание, или завершает свою работу.
Если добавить еще немножко наворотов, то получится guzzle.