W3docs

set_file_buffer()

Узнайте, как stream_set_write_buffer() управляет буферизацией записи в файловый поток PHP, почему set_file_buffer() устарел и как отключить буферизацию.

Введение

В PHP функция stream_set_write_buffer() используется для установки размера буфера записи файлового потока. Это полезная функция для оптимизации производительности PHP-скриптов, позволяющая контролировать сброс данных на диск. Обратите внимание, что более старая функция set_file_buffer() была объявлена устаревшей в PHP 4.3.0 и удалена в PHP 5.0.0, поэтому stream_set_write_buffer() является правильным современным подходом. В этой статье мы рассмотрим всё необходимое о функции stream_set_write_buffer(), включая её синтаксис, параметры и примеры использования.

Понимание функции stream_set_write_buffer()

Функция stream_set_write_buffer() в PHP используется для установки размера буфера записи потока. Она принимает два параметра: ресурс потока и размер буфера в байтах.

При использовании stream_set_write_buffer() PHP настраивает поток на буферизацию данных до указанного количества байт перед сбросом на диск. Установка размера буфера в 0 полностью отключает буферизацию, что является распространённой конфигурацией для вывода в реальном времени. Буфер автоматически сбрасывается, когда достигает указанного размера, когда скрипт завершается или когда вы явно вызываете fflush() для потока. Правильная настройка буфера может быть полезна для оптимизации производительности PHP-скриптов, особенно при записи больших объёмов данных.

Синтаксис функции stream_set_write_buffer()

Синтаксис функции stream_set_write_buffer() выглядит следующим образом:

stream_set_write_buffer($stream, $buffer);

Параметры:

  • $stream — записываемый ресурс потока, как правило возвращаемый функцией fopen().
  • $buffer — размер буфера в байтах. Используйте 0 для отключения буферизации, чтобы каждая операция записи сбрасывалась немедленно.

Согласно руководству PHP, функция возвращает 0 в случае успеха. На практике возвращаемое значение зависит от платформы (некоторые системы возвращают ненулевое значение, даже когда буферизация настроена), поэтому не следует строить логику на его основе. Если вам нужен гарантированный сброс буфера, вызывайте fflush() вместо того, чтобы полагаться на код возврата.

Примеры использования stream_set_write_buffer()

Давайте рассмотрим пример того, как функция stream_set_write_buffer() может использоваться в PHP.

Пример 1: Установка буферизации файла

<?php

$file_handle = fopen('example.txt', 'w');
stream_set_write_buffer($file_handle, 1024);
fwrite($file_handle, 'Hello, world!');
fclose($file_handle);

В этом примере файл example.txt открывается для записи, а буфер записи устанавливается на 1024 байта. Теперь PHP хранит записанные данные в памяти до накопления 1024 байт, до вызова fflush() или до закрытия потока с помощью fclose() — при этом оставшиеся буферизованные данные сбрасываются и освобождаются системные ресурсы. Всегда закрывайте дескриптор после завершения работы.

Пример 2: Отключение буферизации для немедленной записи

Когда вы хотите, чтобы каждая запись сразу попадала на диск — например, при записи в лог-файл, который другой процесс отслеживает в реальном времени — установите размер буфера в 0:

<?php

$log = fopen('app.log', 'a');
stream_set_write_buffer($log, 0); // unbuffered: every fwrite() flushes immediately

fwrite($log, "Request received\n");
fwrite($log, "Response sent\n");

fclose($log);

При отключённой буферизации каждый вызов fwrite() записывается немедленно, не ожидая заполнения буфера, ценой более частых обращений к диску.

Заключение

Функция stream_set_write_buffer() в PHP позволяет оптимизировать производительность скрипта, управляя объёмом данных, которые поток буферизует перед сбросом на диск, — а также полностью отключать буферизацию с размером 0, когда требуется немедленная запись. Поскольку возвращаемое значение функции ненадёжно на разных платформах, сочетайте её с fflush(), когда необходимо принудительно сбросить буфер. Для дальнейшего изучения обратитесь к fopen() для открытия потоков, fwrite() для записи в них и fclose() для их корректного закрытия.

Практика

Практика
Какой правильный современный способ установить буфер записи файлового потока в PHP?
Какой правильный современный способ установить буфер записи файлового потока в PHP?
Was this page helpful?