
Pourquoi j’ai créé FastCSV pour PHP : enfin une gestion CSV qui ne fait pas mal
18 juillet 2025
Comment j’ai apporté la vitesse et la sûreté CSV niveau C à PHP avec FastCSV, une extension native propulsée par FastCSV-C. Benchmarks, API, et pourquoi le support CSV intégré de PHP ne suffit pas.
Si vous avez déjà manipulé des fichiers CSV en PHP, vous connaissez probablement la douleur.
fgetcsv(), SplFileObject, peut-être même un package tiers. Ils marchent — jusqu’à ce qu’ils ne marchent plus. Et vous regardez votre script traîner sur un million de lignes comme en 2005.
Après des années à combattre les cas limites CSV dans plusieurs langages, j’ai créé FastCSV-C : une bibliothèque C haute performance et memory-safe pour le parsing CSV. Mais il restait un langage que je ne pouvais pas laisser de côté :
PHP.
Il avait besoin d’aide CSV sérieuse.
J’ai donc créé FastCSV, une extension PHP native propulsée par le même moteur C — pas de surcharge, pas de fioritures, juste de la vitesse.
Qu’est-ce qui ne va pas avec le support CSV intégré de PHP ?
Je pourrais en énumérer plusieurs.
- Lent sur les gros fichiers – Les fonctions CSV natives deviennent vite lentes
- Comportement incohérent – Résultats différents avec valeurs quotées, fins de ligne et encodages
- Pas de streaming – On finit par charger trop en mémoire
- Peu de flexibilité – Bonne chance pour personnaliser BOM, saut d’en-tête ou règles strictes de quotes
Pour quelques centaines de lignes, vous survivez. Mais dès que le dataset grossit, que le format devient bizarre, ou que vous faites du travail type ETL ?
Mauvaise surprise.
L’idée : apporter la vitesse niveau C à PHP
FastCSV n’est pas un autre wrapper CSV PHP. C’est une extension compilée qui se connecte directement à la bibliothèque FastCSV-C sous le capot. Comme un turbo monté directement dans votre runtime PHP.
Le résultat ? Vous obtenez :
- 🚀 Jusqu’à 4,8× plus rapide en lecture comparé à
SplFileObject - 🧠 Memory safety, même avec des fichiers massifs
- 📦 API drop-in faciles à utiliser
- 📜 Conformité RFC 4180 (quotes, escapes, multiligne — tout géré correctement)
Et comme tout est propulsé par des arenas en C, l’usage mémoire reste plat, même avec des millions de lignes.
Pourquoi pas Rust ou Zig ?
Si vous vous demandez pourquoi je n’ai pas utilisé Rust ou Zig pour cette extension, j’ai essayé ! Pour une plongée dans mes expériences Rust et Zig pour les extensions PHP, voir cet article.
En bref : surcharge FFI, galères de build system et compromis memory safety ont fait de C le meilleur choix pour ce job.
Benchmarks réels
Voici ce que l’extension fait concrètement :
| Rows | SplFileObject |
FastCSV | Speedup |
|---|---|---|---|
| 1K | 15.0 ms | 3.6 ms | 4.1× |
| 100K | 639.5 ms | 176.0 ms | 3.6× |
| 1M | 9.4 sec | 1.98 sec | 4.8× |
Utiliser FastCSV en PHP : une API qui respire
Lecture simple :
$reader = new FastCSVReader('/path/to/file.csv');
while ($reader->hasNext()) {
$record = $reader->nextRecord();
print_r($record);
}
Config avancée :
$config = new FastCSVConfig();
$config->setDelimiter(';');
$config->setHasHeader(true);
$reader = new FastCSVReader($config);
$reader->open('/path/to/file.csv');
Écriture de CSV :
$writer = new FastCSVWriter('/path/to/output.csv', ['Name', 'Age', 'City']);
$writer->writeRecord(['Alice', '30', 'Paris']);
$writer->writeRecord(['Bob', '25', 'Madrid']);
Conçu pour la rétrocompatibilité
Tous les serveurs de prod ne permettent pas d’installer des extensions PHP. C’est pourquoi je maintiens aussi PHP-CSVHelper— un wrapper pure-PHP qui utilise FastCSV quand disponible, et retombe sur le PHP natif sinon.
La même API partout. Les perfs là où c’est possible.
Pas de compromis. (Plus de détails dans un prochain article.)
Pour qui ?
FastCSV est fait pour :
- Les devs qui travaillent avec d’énormes datasets CSV
- Les pipelines ETL et outils d’import de données
- Les API haute performance qui ont besoin de sortie CSV
- Les projets exigeant une vraie conformité RFC 4180 (pas seulement « ça marche chez moi »)
La suite ?
- Pagination et filtrage
- Chunking
- Parallélisme
- Langage de requête pour CSV
Réflexions finales
Il ne s’agit pas de réinventer la roue. Il s’agit de la faire tourner plus vite — sans vaciller.
Si vous avez déjà fixé un import CSV à 9 secondes en pensant « Il doit y avoir mieux » — il y a.
FastCSV, c’est ce que j’aurais voulu voir intégré à PHP depuis longtemps.
API propres. Vitesse native. Pas de larmes CSV.
Essayez et dites-moi ce que vous cassez 😄
🔗 GitHub: csvtoolkit/FastCSV-ext
📖 Docs: csvtoolkit.org/docs/fastcsv-ext
🧠 Histoire : Comment j’ai construit le cœur C



