PHP 7.4.25 Released!

stream_set_write_buffer

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_set_write_bufferУстанавливает буферизацию файла при записи в указанный поток

Описание

stream_set_write_buffer(resource $stream, int $buffer): int

Устанавливает буферизацию для операций записи на заданном потоке stream в число buffer байт.

Список параметров

stream

Файловый указатель.

buffer

Число байт для буферизации. Если аргумент buffer равен 0, то операции записи не буферизуются. Это гарантирует, что все операции записи с использованием функции fwrite() будут завершены перед тем, как другим процессам будет разрешено записывать в поток вывода.

Возвращаемые значения

Возвращает 0 в случае успешного выполнения, или другое значение в случае, если запрос не может быть выполнен.

Примеры

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

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

<?php
$fp 
fopen($file"w");
if (
$fp) {
   if (
stream_set_write_buffer($fp0) !== 0) {
      
// не удалось внести изменение
  
}
  
fwrite($fp$output);
  
fclose($fp);
}
?>

Смотрите также

  • fopen() - Открывает файл или URL
  • fwrite() - Бинарно-безопасная запись в файл
add a note add a note

User Contributed Notes 2 notes

up
1
MOX
3 days ago
The stream_set_write_buffer() function has been broken since PHP 4.3.0. As a workaround, I would suggest using a php_user_filter as an output buffer. By using the following class I have measured over 50% performance improvements with scripts that generate large text files by writing them one line at a time:

class my_output_buffer extends php_user_filter
{
    protected static $BUFFER_SIZE = 4096;

    function onCreate( ) {
        $this->bff = [];
        $this->len = 0;
        return true;
    }

    public function filter($in, $out, &$consumed, $closing)
    {
        $rv = PSFS_FEED_ME; /* assume no output */

        /* process input */
        while ($bucket = stream_bucket_make_writeable($in)) {

            /* bucket is too big for the buffer? */
            $space = static::$BUFFER_SIZE - $this->len;

            if ($bucket->datalen >= $space) {
                /* consume data by placing it into internal buffers */
                $this->bff[] = substr($bucket->data, 0, $space);
                $this->len += $space;
                $overflow = substr($bucket->data, $space);
                $ovfl_len = $bucket->datalen - $space;
                $consumed += $bucket->datalen;

                assert($this->len == static::$BUFFER_SIZE);

                /* make one big bucket */
                $bucket->data = implode('', $this->bff);
                $bucket->datalen = static::$BUFFER_SIZE;
                stream_bucket_append($out, $bucket);
                $rv = PSFS_PASS_ON; /* we have output! */

                /* handle overflow */
                $this->bff = [$overflow];
                $this->len = $ovfl_len;
            }
            else {
                /* consume data by placing it into internal buffers */
                $this->bff[] = $bucket->data;
                $this->len += $bucket->datalen;
                $consumed += $bucket->datalen;
            }
        }

        /* stream is closing and we have data? */
        if ($closing && $this->len > 0) {
            /* make one last bucket */
            $data = implode('', $this->bff);
            $bucket = stream_bucket_new($this->stream, $data);
            stream_bucket_append($out, $bucket);
            $rv = PSFS_PASS_ON; /* we have output! */

            /* clear internal buffer */
            $this->bff = [];
            $this->len = 0;
        }

        return $rv;
    }
}

$fp = fopen('foobar.txt', 'w');

/* enable filtering */
stream_filter_register('output.buffer', 'my_output_buffer');
stream_filter_append($fp, 'output.buffer');

/* a lot of small writes */
for ($i = 0; $i < 10000; $i++) {
    fwrite($fp, 'x');
}

fclose($fp);
up
1
kevin at bonnevillessei dot com
3 years ago
Trying to use stream_set_write_buffer on a local file will always fail according to this note from 2003.

http://grokbase.com/t/php/php-internals/0351gp6xtn/stream-set-write-buffer-does-not-work

Example:

$fp = fopen("localfile.txt", "w");
if (stream_set_write_buffer($fp, 0) !== 0) {
    // changing the buffering failed is always true on local files
}
To Top