stream_get_line

(PHP 5, PHP 7, PHP 8)

stream_get_lineObtiene una línea del recurso de flujo hasta un delimitador dado

Descripción

stream_get_line(resource $handle, int $length, string $ending = ?): string

Obtiene una linea desde el gestor dado.

La lectura finaliza cuando hayan sido leídos length bytes, cuando se encuentre la cadena especificada por ending (la cuál no está incluida en el valor devuelto), o sobre EOF (lo que suceda primero).

Esta función es casi indéntica a fgets() excepto que permite delimitadores de fin de línea distintos a los habituales \n, \r, y \r\n, y no devuelve el delimitador mismo.

Parámetros

handle

Un gestor de archivo válido.

length

El número de bytes a leer desde el gestor.

ending

Un delimitador de cadena opcional.

Valores devueltos

Devuelve una cadena de hasta length bytes leídos desde el archivo apuntado por handle.

Si ocurre un error, devuelve false.

Ver también

  • fread() - Lectura de un fichero en modo binario seguro
  • fgets() - Obtiene una línea desde el puntero a un fichero
  • fgetc() - Obtiene un carácter de un puntero a un archivo
add a note

User Contributed Notes 2 notes

up
12
pk at ritm dot ru
14 years ago
fgets is faster but stream_get_line is more useful in a tcp server scripts.

when fgets reads some bytes from socket, where EOF is reached, it returns bool(false) same as stream_get_line

BUT if remote client drops connection, and server script will try to read some data with function fgets, function will return bool(false), and stream_get_line will return string(0) ""

so you can detect remote client disconnection with stream_get_line, and cannot with fgets
up
9
Anonymous
12 years ago
WARNING:
Specifying a length of 0 does NOT give you an infinite length, contrary to what the documentation might suggest. Instead, setting a length of 0 just makes the function default to a length of 8192. To be precise, it gets the value PHP_SOCK_CHUNK_SIZE (8192) in ext/standard/streamsfuncs.c.

So, let's say you're trying to read ALL data until you reach a "\x03" (decimal 3) byte. How do you GUARANTEE that this is the case? Well, there's no way! The only thing you can do stream_get_lin() into a "master" string, then fseek() backwards by 1 character, then fgetc() and verify that it's "\x03". If you don't see a "\x03", it means that stream_get_line() has aborted after 8192 bytes and before hitting "\x03", and you'll have to call it again. Keep appending the return values to a "master" string until you hit a "\x03" or EOF... That's the ONLY way to properly build a string that contains EVERYTHING until the character you're looking for.
To Top