Maison  >  Article  >  développement back-end  >  Deux façons d'implémenter la fonction php fseek pour lire des fichiers volumineux

Deux façons d'implémenter la fonction php fseek pour lire des fichiers volumineux

墨辰丷
墨辰丷original
2018-06-01 10:01:361623parcourir

La lecture de fichiers en php est très simple, mais si le fichier lu est très volumineux, comment le résoudre ? Nous pouvons directement utiliser fseek pour gérer des fichiers volumineux. Cet article présente comment PHP utilise la fonction fseek pour lire des fichiers volumineux. Les amis qui en ont besoin peuvent se référer à

PHP lit les fichiers volumineux. L'utilisation de la fonction fseek est la plus courante. . méthode, il n'est pas nécessaire de lire tout le contenu du fichier dans la mémoire, mais fonctionne directement via des pointeurs, donc l'efficacité est assez efficace. Lorsque vous utilisez fseek pour faire fonctionner des fichiers, il existe de nombreuses méthodes différentes, et l'efficacité peut être. légèrement Il y a des différences. Voici deux méthodes couramment utilisées

Méthode 1 :

Trouvez d'abord le dernier EOF du fichier via fseek, puis trouvez le début. de la dernière ligne. La position de départ, récupérez les données de cette ligne, puis trouvez la position de départ de la ligne suivante, puis prenez la position de cette ligne, et ainsi de suite, jusqu'à ce que la ligne $num soit trouvée. Le code d'implémentation est le suivant :

L'exécution complète du code prend 0,0095 (s)

function tail($fp,$n,$base=5)
{
  assert($n>0);
  $pos = $n+1;
  $lines = array();
  while(count($lines)< =$n){
    try{
      fseek($fp,-$pos,SEEK_END);
    } catch (Exception $e){
      fseek(0);
      break;
    }
    $pos *= $base;
    while(!feof($fp)){
      array_unshift($lines,fgets($fp));
    }
  }
  return array_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));

Méthode 2 :

Utilisez toujours fseek pour lire à partir de la fin du fichier, mais cette fois, il ne s'agit pas de lire petit à petit, mais de lire morceau par morceau. Chaque fois qu'une donnée est lue, les données lues sont lues. placé dans un buf, puis utilisez le nombre de caractères de nouvelle ligne (n) pour déterminer si les dernières $num lignes de données ont été lues. Le code d'implémentation est le suivant

L'exécution entière du code prend 0,0009(. s).

$fp = fopen($file, "r");
$line = 10;
$pos = -2;
$t = " ";
$data = "";
while ($line > 0) {
  while ($t != "n") {
    fseek($fp, $pos, SEEK_END);
    $t = fgetc($fp);
    $pos --;
  }
  $t = " ";
  $data .= fgets($fp);
  $line --;
}
fclose ($fp);
echo $data

Résumé : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

PHP utilise la fonction preg_split pour diviser les chaînes contenant des sauts de ligne et des points-virgules

Le programme PHP est implémenté comme suit La fonction

array_keys en php renvoie le nom de clé du tableau

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn