stream_get_line în PHP

Stream-uri PHP 5.0+

Citește dintr-un stream până la un separator ales de tine, fără să includă separatorul în rezultat.

Sintaxă
stream_get_line($stream, int $length, string $ending = ''): string|false

Ce face stream_get_line

stream_get_line seamănă cu fgets, cu două diferențe. Separatorul poate fi orice text ("\n", "\r\n", "||"), iar separatorul nu apare în rezultat, deci nu mai ai nevoie de trim.

Citirea se oprește și când s-au adunat $length octeți. Restul liniei vine la apelul următor. La finalul stream-ului funcția returnează false.

Parametri

Parametru Descriere
$stream Stream-ul din care citești.
$length Numărul maxim de octeți citiți la un apel.
$ending Opțional. Separatorul. Fără el, citirea se oprește doar la $length sau la final.

Ce returnează

Textul până la separator (fără separator) sau false când nu mai este nimic de citit.

Exemple

Exemplul 1: Linii fără caracterul de linie nouă

<?php
$m = fopen("php://memory", "r+");
fwrite($m, "Ana\nIon\nMaria");
rewind($m);

while (($linie = stream_get_line($m, 1024, "\n")) !== false) {
    echo "[$linie]\n";
}

Rezultat

[Ana]
[Ion]
[Maria]

Exemplul 2: Înregistrări separate prin ||

<?php
$m = fopen("php://memory", "r+");
fwrite($m, "Ana;Iași||Ion;Cluj||Maria;Brașov");
rewind($m);

while (($rand = stream_get_line($m, 1024, "||")) !== false) {
    [$nume, $oras] = explode(";", $rand);
    echo "$nume locuiește în $oras\n";
}

Rezultat

Ana locuiește în Iași
Ion locuiește în Cluj
Maria locuiește în Brașov

Exemplul 3: Linia goală și limita de lungime

A doua linie este goală și vine ca text gol, nu ca false. A treia linie are 7 caractere, iar limita este 4, așa că vine în două bucăți.

<?php
$m = fopen("php://memory", "r+");
fwrite($m, "a\n\nbcdefgh\n");
rewind($m);

while (($linie = stream_get_line($m, 4, "\n")) !== false) {
    var_dump($linie);
}

Rezultat

string(1) "a"
string(0) ""
string(4) "bcde"
string(3) "fgh"

Greșeli frecvente

  • Scrii bucla ca while ($linie = stream_get_line(...)). O linie goală sau linia "0" sunt considerate false și bucla se oprește prea devreme. Compară cu !== false.
  • Pui un $length prea mic. Liniile mai lungi sunt tăiate în bucăți, fără niciun avertisment.

Comenzi înrudite

  • fgets: Citește o linie dintr-un fișier deschis cu fopen.
  • stream_get_contents: Citește tot ce a rămas într-un stream deschis (fișier, memorie, socket, proces) și returnează ca text.
  • explode: Împarte un text în bucăți după un separator și le pune într-un tablou.