stream_set_write_buffer / stream_set_read_buffer în PHP

Stream-uri PHP 4.3+ (stream_set_read_buffer: PHP 5.3.3+)

Schimbă dimensiunea bufferului de scriere sau de citire al unui stream; 0 îl dezactivează.

Sintaxă
stream_set_write_buffer($stream, int $size): int

Ce face stream_set_write_buffer / stream_set_read_buffer

stream_set_write_buffer stabilește câți octeți se adună în memorie înainte de scrierea efectivă. Merge doar la stream-urile care au un astfel de buffer, de exemplu pipe-urile din popen. Fișierele deschise cu fopen sunt scrise oricum direct de PHP, așa că funcția returnează -1 pentru ele. Numele vechi set_file_buffer este un alias.

stream_set_read_buffer face același lucru pentru citire. PHP citește de obicei câte 8192 de octeți deodată, chiar dacă tu ceri 16. Cu bufferul 0, citește exact cât ceri, lucru util la dispozitive precum /dev/urandom.

Parametri

Parametru Descriere
$stream Stream-ul modificat.
$size Dimensiunea bufferului în octeți. 0 dezactivează bufferul.

Ce returnează

0 la succes, altă valoare (de obicei -1) dacă stream-ul nu suportă schimbarea.

Exemple

Exemplul 1: Pipe sau fișier obișnuit

<?php
$pipe = popen("cat > /dev/null", "w");
var_dump(stream_set_write_buffer($pipe, 0));
pclose($pipe);

$fisier = fopen("jurnal.log", "w");
var_dump(stream_set_write_buffer($fisier, 0));
fclose($fisier);

Rezultat

int(0)
int(-1)

Exemplul 2: Citire exactă din /dev/urandom

Fără buffer, PHP cere sistemului doar 16 octeți, nu 8192. Pentru valori aleatoare în cod nou, random_bytes(16) este mai simplu.

<?php
$f = fopen("/dev/urandom", "r");
var_dump(stream_set_read_buffer($f, 0));

$octeti = fread($f, 16);
fclose($f);

echo "Am citit " . strlen($octeti) . " octeți";

Rezultat

int(0)
Am citit 16 octeți

Greșeli frecvente

  • Verifici if (stream_set_write_buffer($f, 0)). Succesul este 0, adică fals. Compară cu === 0.

Comenzi înrudite

  • stream_set_chunk_size: Schimbă dimensiunea bucăților în care PHP citește dintr-un stream și le trece prin filtre.
  • fwrite / fputs: Scrie un text într-un fișier deschis cu fopen. fputs este același lucru, cu alt nume.
  • popen / pclose: Pornește o comandă și returnează un stream din care citești ieșirea ei sau în care îi scrii date; pclose o închide.
  • random_bytes: Generează octeți aleatorii siguri, pentru token-uri, chei și coduri secrete.