Ce face stream_bucket_make_writeable
În metoda filter a unui filtru propriu, datele vin într-o „brigadă” de bucket-uri. stream_bucket_make_writeable($in) scoate următorul bucket, ca obiect cu proprietățile data (textul) și datalen (lungimea), sau null când nu mai sunt.
stream_bucket_append($out, $bucket) pune bucket-ul la finalul ieșirii, iar stream_bucket_prepend la început. stream_bucket_new($this->stream, "text") creează un bucket nou, de exemplu pentru un text adăugat la final. Din PHP 8.4, bucket-urile sunt obiecte ale clasei StreamBucket.
Parametri
| Parametru | Descriere |
|---|---|
$brigade |
Brigada de intrare, adică parametrul $in al metodei filter. |
Ce returnează
Următorul bucket sau null dacă brigada este goală.
Exemple
Exemplul 1: O semnătură adăugată la final
La ultimul apel, $closing este true. Atunci filtrul creează un bucket nou cu stream_bucket_new și îl adaugă după text.
<?php
class Semnatura extends php_user_filter
{
public function filter($in, $out, &$consumed, bool $closing): int
{
while ($bucket = stream_bucket_make_writeable($in)) {
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
if ($closing) {
stream_bucket_append($out, stream_bucket_new($this->stream, "\n-- Trimis de Ana"));
}
return PSFS_PASS_ON;
}
}
stream_filter_register("semnatura", "Semnatura");
file_put_contents("php://filter/write=semnatura/resource=mesaj.txt", "Ne vedem mâine la 10.");
echo file_get_contents("mesaj.txt");
Rezultat
Ne vedem mâine la 10.
-- Trimis de Ana
Exemplul 2: Un antet pus înainte
<?php
class Antet extends php_user_filter
{
private bool $pus = false;
public function filter($in, $out, &$consumed, bool $closing): int
{
while ($bucket = stream_bucket_make_writeable($in)) {
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
if (!$this->pus) {
stream_bucket_prepend($out, stream_bucket_new($this->stream, "[CONFIDENȚIAL] "));
$this->pus = true;
}
return PSFS_PASS_ON;
}
}
stream_filter_register("antet", "Antet");
file_put_contents("raport.txt", "Profit: 12.000 lei");
echo file_get_contents("php://filter/read=antet/resource=raport.txt");
Rezultat
[CONFIDENȚIAL] Profit: 12.000 lei
Greșeli frecvente
- Uiți să aduni
$bucket->datalenla$consumed. PHP nu știe cât ai prelucrat și unele funcții raportează greșit numărul de octeți. - Modifici
$bucket->datași uiți să apelezistream_bucket_append. Datele nu mai ajung la ieșire.
Comenzi înrudite
stream_filter_register: Înregistrează un filtru de stream propriu, scris ca o clasă care extinde php_user_filter.stream_filter_append / stream_filter_prepend: Atașează un filtru unui stream, ca datele să fie transformate (majuscule, base64, comprimare) la citire sau scriere.