stream_set_write_buffer

(PHP 4 >= 4.3.0, PHP 5)

stream_set_write_buffer — Sets file buffering on the given stream

Description

int stream_set_write_buffer ( resource $stream , int $buffer )

Output using fwrite() is normally buffered at 8K. This means that if there are two processes wanting to write to the same output stream (a file), each is paused after 8K of data to allow the other to write. stream_set_write_buffer() sets the buffering for write operations on the given filepointer stream to buffer bytes. If buffer is 0 then write operations are unbuffered. This ensures that all writes with fwrite() are completed before other processes are allowed to write to that output stream.

The function returns 0 on success, or EOF if the request cannot be honored.

The following example demonstrates how to use stream_set_write_buffer() to create an unbuffered stream.

Пример #1 stream_set_write_buffer() example

<?php
$fp 
fopen($file"w");
if (
$fp) {
  
stream_set_write_buffer($fp0);
  
fwrite($fp$output);
  
fclose($fp);
}
?>

See also fopen() and fwrite().

Коментарии

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
}
2018-05-20 03:15:03
http://php5.kiev.ua/manual/ru/function.stream-set-write-buffer.html
Автор:
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);
2021-10-20 15:56:01
http://php5.kiev.ua/manual/ru/function.stream-set-write-buffer.html

    Поддержать сайт на родительском проекте КГБ