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 este0, 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.