Position actuelle: Accueil> Derniers articles> Comment éviter le débordement de la mémoire lorsque la fonction PHP File () lit des fichiers volumineux? Partager des compétences pratiques

Comment éviter le débordement de la mémoire lorsque la fonction PHP File () lit des fichiers volumineux? Partager des compétences pratiques

gitbox 2025-08-30

1. Utilisation de base de la fonction de fichier ()

La fonction file () est une fonction intégrée en PHP qui lit chaque ligne d'un fichier en tant qu'élément de tableau. Son utilisation de base est la suivante:

 <span><span><span class="hljs-variable">$file_array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>);
</span></span>

Cela lira chaque ligne du fichier grandfile.txt en mémoire en tant qu'élément du tableau. Si le fichier est très grand, cela peut consommer beaucoup de mémoire et causer des problèmes de débordement de mémoire.

2. Pourquoi le fichier () provoque-t-il un débordement de mémoire?

La fonction fichier () lit chaque ligne du fichier en mémoire et renvoie un tableau. Si le fichier est très grand, en particulier les fichiers qui dépassent plusieurs centaines de mégaoctets ou plus, tous les contenus du fichier seront stockés en mémoire en même temps, ce qui entraîne une forte augmentation de la consommation de mémoire. Une fois que la mémoire atteint la limite supérieure, PHP lancera une erreur de débordement de mémoire.

3. Utilisez fopen () et fgets () au lieu de la fonction file ()

Afin d'éviter de charger le fichier entier en mémoire à la fois, nous pouvons utiliser la fonction fopen () pour combiner fgets () pour lire le contenu du fichier ligne par ligne. Cela réduit l'utilisation de la mémoire car une seule ligne du fichier est lue à la fois, pas le fichier entier.

 <span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span>) {
    </span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-comment">// Traiter chaque ligne</span></span><span>
    }
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Impossible d&#39;ouvrir le fichier'</span></span><span>;
}
</span></span>

Cette méthode évite de charger le fichier entier en même temps en lisant le fichier ligne par ligne, réduit considérablement l'utilisation de la mémoire et convient au traitement des fichiers volumineux.

4. Utilisez fseek () et fread () pour la lecture de la chasse

En plus de la lecture ligne par ligne, nous pouvons également utiliser les fonctions fseek () et fread () pour lire les fichiers par bloc. Fseek () peut localiser les pointeurs de fichiers, tandis que Fread () peut lire les blocs de données d'une taille spécifiée. Cette approche convient aux scénarios où de grands fichiers doivent être traités, en particulier lorsque nous devons traiter des parties spécifiques des données.

 <span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span>) {
    </span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>)) {
        </span><span><span class="hljs-comment">// Chaque lecture 1MB données</span></span><span>
        </span><span><span class="hljs-variable">$chunk</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-number">1048576</span></span><span>); </span><span><span class="hljs-comment">// 1MB = 1024 * 1024 bytes</span></span><span>
        </span><span><span class="hljs-comment">// 处理读取的données块</span></span><span>
    }
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Impossible d&#39;ouvrir le fichier'</span></span><span>;
}
</span></span>

En lisant des morceaux de taille fixe, nous pouvons réduire l'utilisation de la mémoire et traiter les données du fichier étape par étape, plutôt que de charger le fichier entier en mémoire à la fois.

5. définir des limites de mémoire raisonnables

Si le fichier est grand et que vous devez utiliser la fonction fichier () , une autre méthode consiste à augmenter de manière appropriée la limite de mémoire de PHP. Vous pouvez augmenter la limite d'utilisation de la mémoire en modifiant le paramètre Memory_limit dans le fichier php.ini , ou en définissant dynamiquement ini_set () dans le code:

 <span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'memory_limit'</span></span><span>, </span><span><span class="hljs-string">'512M'</span></span><span>); </span><span><span class="hljs-comment">// Se présenter comme 512MB</span></span><span>
</span></span>

Bien que l'augmentation des limites de mémoire puisse parfois résoudre les problèmes de débordement de la mémoire, ce n'est pas une solution à long terme car elle peut entraîner une surutilisation de la mémoire du serveur, en particulier en cas de concurrence élevée.

6. Utilisez la classe SplFileObject

La classe SPLFIleObject de PHP fournit un moyen efficace de lire des fichiers. Contrairement à la fonction File () , SPLFILEOBject est un objet qui vous permet de lire le contenu du fichier de manière plus flexible tout en évitant de charger le fichier entier en mémoire. Vous pouvez lire les fichiers ligne par ligne via un itérateur pour enregistrer la mémoire.

 <span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">SplFileObject</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>);
</span><span><span class="hljs-variable">$file</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">setFlags</span></span><span>(</span><span><span class="hljs-title class_">SplFileObject</span></span><span>::</span><span><span class="hljs-variable constant_">READ_CSV</span></span><span>); </span><span><span class="hljs-comment">// Vous pouvez définir le format de lecture de fichiers</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$line</span></span><span>) {
    </span><span><span class="hljs-comment">// Traiter chaque ligne</span></span><span>
}
</span></span>

SPLFileObject peut lire les fichiers par ligne et gérer automatiquement les pointeurs de fichiers, il s'agit donc d'un choix très efficace lorsqu'il s'agit de fichiers volumineux.

7. Résumé et meilleures pratiques

Lorsque vous devez lire les fichiers volumineux, l'utilisation de la fonction File () peut ne pas être le meilleur choix, car il chargera le fichier entier en mémoire. Pour éviter le débordement de la mémoire, les méthodes suivantes peuvent être utilisées:

  1. Utilisez fopen () et fgets () pour lire le fichier ligne par ligne pour éviter de tout charger à la fois.

  2. Utilisez fseek () et fread () pour la lecture de blocs, ce qui convient particulièrement pour le traitement des parties spécifiques des données.

  3. Une augmentation des limites de mémoire pour PHP, bien que non recommandée comme solution à long terme, peut résoudre le problème dans certains cas.

  4. À l'aide de la classe SPLFileObject , il fournit un moyen plus flexible et efficace de lire des fichiers, ce qui convient particulièrement aux opérations de fichiers importantes.

Le choix de la méthode appropriée en fonction des besoins spécifiques peut efficacement éviter le débordement de la mémoire et améliorer les performances du programme.