PHP 8.3.4 Released!

stream_set_write_buffer

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

stream_set_write_bufferBelirtilen akımda dosya yazma tamponunu ayarlar

Açıklama

stream_set_write_buffer(resource $akım, int $boyut): int

akım üzerinde yazma işlemleri için boyut baytlık tamponu etkin kılar.

Bağımsız Değişkenler

akım

Dosya tanıtıcısı.

boyut

Tamponun bayt sayısı. 0 belirtilirse yazma işlemleri tamponsuz yapılır. Böylece, çıktı akımına dığer süreçlerin yazmasına izin vermeden önce fwrite() ile yapılan tüm yazma işlemlerinin tamamlanması sağlanır.

Dönen Değerler

Başarı durumunda 0, istek yerine getirilememişse sıfırdan farklı bir değer döner.

Örnekler

Örnek 1 - stream_set_write_buffer() örneği

Aşağıdaki örnekte stream_set_write_buffer() işlevinin bir tamponsuz akım oluşturmak için kullanımı gösterilmiştir.

<?php
$dt
= fopen($file, "w");
if (
$dt) {
if (
stream_set_write_buffer($fp, 0) !== 0) {
// tampon ayarlanamadı
}
fwrite($dt, $output);
fclose($dt);
}
?>

Ayrıca Bakınız

  • fopen() - Bir dosya veya URL'yi açar
  • fwrite() - Dosyaya ikil kipte yazar
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