PHP 8.3.4 Released!

stream_set_write_buffer

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

stream_set_write_bufferEstablece el búfer para escritura de ficheros en el flujo dado

Descripción

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

Establece el buffer para escribir operaciones en el stream dado a buffer bytes.

La salida usando fwrite() normalmente tiene un buffer de 8K. Esto significa que si hay dos procesos esperando a escribir en el mismo flujo de salida (un fichero), cada uno se pausa después de 8K de información para permitir que el otro escriba.

Parámetros

stream

El puntero a un fichero.

buffer

El número de bytes del buffer. Si buffer es 0 las operaciones de escritura no usarán buffer. Esto asegura que todas las escrituras con fwrite() se completen antes de que a otros procesos se les permita escribir en ese flujo de salida.

Valores devueltos

Devuelve 0 en caso de éxito, u otro valor si la petición no se pudo satisfacer.

Ejemplos

Ejemplo #1 Ejemplo de stream_set_write_buffer()

El siguiente ejemplo muestra cómo usar stream_set_write_buffer()para crear un flujo sin buffer.

<?php
$fp
= fopen($file, "w");
if (
$fp) {
if (
stream_set_write_buffer($fp, 0) !== 0) {
// cambiar el almacenamiento en bufer fallido
}
fwrite($fp, $output);
fclose($fp);
}
?>

Ver también

  • fopen() - Abre un fichero o un URL
  • fwrite() - Escritura de un archivo en modo binario seguro
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