stream_bucket_make_writeable în PHP

Stream-uri PHP 5.0+

Ia următoarea bucată de date din intrarea unui filtru propriu; împreună cu stream_bucket_append/prepend/new.

Sintaxă
stream_bucket_make_writeable($brigade): ?StreamBucket

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->datalen la $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ă apelezi stream_bucket_append. Datele nu mai ajung la ieșire.

Comenzi înrudite