PHP 8.3.4 Released!

stream_set_write_buffer

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

stream_set_write_bufferDefine o tamanho do buffer de escrita do fluxo

Descrição

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

Define o tamanho do buffer de operações de escrita no fluxo informado em stream para o número de bytes informado em size.

Parâmetros

stream

O ponteiro para o arquivo.

size

O número de bytes do buffer. Se size for 0, as operações de escrita não terão buffer. Isto assegura que todas as operações de escrita com fwrite() estejam completas antes que outros processos possam escrever no fluxo de saída.

Valor Retornado

Retorna 0 em caso de sucesso, ou outro valor se a requisição não puder ser cumprida.

Exemplos

Exemplo #1 Exemplo de stream_set_write_buffer()

O exemplo a seguir demonstra como usar stream_set_write_buffer() para criar fluxo sem buffer.

<?php
$fp
= fopen($file, "w");
if (
$fp) {
if (
stream_set_write_buffer($fp, 0) !== 0) {
// falha na mudança de buffer
}
fwrite($fp, $output);
fclose($fp);
}
?>

Veja Também

  • fopen() - Abre um arquivo ou URL
  • fwrite() - Escrita binary-safe em arquivos
add a note

User Contributed Notes 2 notes

up
1
MOX
2 years 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
5 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