PHP 8.4.2 Released!

fgets

(PHP 4, PHP 5, PHP 7, PHP 8)

fgetsRécupère la ligne courante à partir de l'emplacement du pointeur sur fichier

Description

fgets(resource $stream, ?int $length = null): string|false

Récupère la ligne courante à partir de l'emplacement du pointeur sur fichier.

Liste de paramètres

stream

Le pointeur de fichier doit être valide et pointer sur un fichier ouvert avec succès par fopen() ou fsockopen() (et pas encore fermé par fclose()).

length

Lit jusqu'à la taille length - 1 octet depuis le pointeur de fichier stream, ou bien la fin du fichier, ou une nouvelle ligne (qui est inclue dans la valeur retournée), ou encore un EOF (celui qui arrive en premier). Si aucune longueur n'est fournie, la fonction lira le flux jusqu'à la fin de la ligne.

Valeurs de retour

Retourne une chaîne de caractères contenant les length premiers caractères, moins 1 octet depuis le pointeur de fichier stream. false est retourné s'il n'y a plus de données à lire.

Si une erreur survient, la fonction retourne false.

Exemples

Exemple #1 Lecture d'un fichier ligne par ligne

<?php

$fp
= @fopen("/tmp/inputfile.txt", "r");

if (
$fp) {
while ((
$buffer = fgets($fp, 4096)) !== false) {
echo
$buffer, PHP_EOL;
}
if (!
feof($fp)) {
echo
"Erreur: fgets() a échoué\n";
}

fclose($fp);
}

?>

Notes

Note: Si PHP ne reconnaît pas correctement les fins de lignes lors de la lecture de fichiers qui ont été créés ou lus sur un Macintosh, l'activation de l'option de configuration auto_detect_line_endings peut régler le problème.

Note:

Les programmeurs habitués à la programmation 'C' noteront que fgets() ne se comporte pas comme son équivalent C lors de la rencontre de la fin du fichier.

Voir aussi

  • fgetss() - Renvoie la ligne courante du fichier et élimine les balises HTML
  • fread() - Lecture du fichier en mode binaire
  • fgetc() - Lit un caractère dans un fichier
  • stream_get_line() - Lit une ligne dans un flux
  • fopen() - Ouvre un fichier ou une URL
  • popen() - Crée un processus de pointeur de fichier
  • fsockopen() - Ouvre un socket de connexion Internet ou Unix
  • stream_set_timeout() - Configure la durée d'expiration d'un flux

add a note

User Contributed Notes 5 notes

up
20
Leigh Purdie
9 years ago
A better example, to illustrate the differences in speed for large files, between fgets and stream_get_line.

This example simulates situations where you are reading potentially very long lines, of an uncertain length (but with a maximum buffer size), from an input source.

As Dade pointed out, the previous example I provided was much to easy to pick apart, and did not adequately highlight the issue I was trying to address.

Note that specifying a definitive end-character for fgets (ie: newline), generally decreases the speed difference reasonably significantly.

#!/usr/bin/php
<?php
$plaintext
=file_get_contents('http://loripsum.net/api/60/verylong/plaintext'); # Should be around 90k characters
$plaintext=str_replace("\n"," ",$plaintext); # Get rid of newlines

$fp=fopen("/tmp/SourceFile.txt","w");
for(
$i=0;$i<100000;$i++) {
fputs($fp,substr($plaintext,0,rand(4096,65534)) . "\n");
}
fclose($fp);

$fp=fopen("/tmp/SourceFile.txt","r");
$start=microtime(true);
while(
$line=fgets($fp,65535)) {
1;
}
$end=microtime(true);
fclose($fp);
$delta1=($end - $start);

$fp=fopen("/tmp/SourceFile.txt","r");
$start=microtime(true);
while(
$line=stream_get_line($fp,65535)) {
1;
}
$end=microtime(true);
fclose($fp);
$delta2=($end - $start);

$pdiff=$delta1/$delta2;
print
"stream_get_line is " . ($pdiff>1?"faster":"slower") . " than fgets - pdiff is $pdiff\n";
?>

$ ./testcase.php
stream_get_line is faster than fgets - pdiff is 1.760398041785

Note that, in a vast majority of situations in which php is employed, tiny differences in speed between system calls are of negligible importance.
up
3
Anonymous
4 years ago
if you for some reason need to get lines from a string instead of a file pointer, try

<?php
function string_gets(string $source, int $offset = 0, string $delimiter = "\n"): ?string
{
$len = strlen($source);
if (
$len < $offset) {
// out of bounds.. maybe i should throw an exception
return null;
}
if (
$len === $offset) {
// end of string..
return null;
}
$delimiter_pos = strpos($source, $delimiter, $offset);
if (
$delimiter_pos === false) {
// last line.
return substr($source, $offset);
}
return
substr($source, $offset, ($delimiter_pos - $offset) + strlen($delimiter));
}

?>

(i had a ~16GB string in-memory i needed to process line-by-line, but i would get memory-allocation-crash (on a 32GB ram system) if i tried explode("\n",$str); , so came up with this.. interestingly, fgets() seems to be faster than doing it in-ram-in-php, though. php 7.3.7)
up
4
David at Weintraub.name
17 years ago
There's an error in the documentation:

The file pointer must be valid, and must point to a file successfully opened by fopen() or fsockopen() (and not yet closed by fclose()).

You should also add "popen" and "pclose" to the documentation. I'm a new PHP developer and went to verify that I could use "fgets" on commands that I used with "popen".
up
2
Peter Schlaile
17 years ago
fscanf($file, "%s\n") isn't really a good substitution for fgets(), since it will stop parsing at the first whitespace and not at the end of line!

(See the fscanf page for details on this)
up
1
tavernadelleidee[italy]
18 years ago
I think that the quickest way of read a (long) file with the rows in reverse order is

<?php
$myfile
= 'myfile.txt';
$command = "tac $myfile > /tmp/myfilereversed.txt";
passthru($command);
$ic = 0;
$ic_max = 100; // stops after this number of rows
$handle = fopen("/tmp/myfilereversed.txt", "r");
while (!
feof($handle) && ++$ic<=$ic_max) {
$buffer = fgets($handle, 4096);
echo
$buffer."<br>";
}
fclose($handle);
?>

It echos the rows while it is reading the file so it is good for long files like logs.

Borgonovo
To Top