PHPCSVExtensionPerformanceC

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

Tous les articles
Liens

À lire aussi

juil. 2025

Pourquoi j’ai créé FastCSV-C : simplifier le CSV entre langages

Pendant des années, le CSV en Python et PHP m’a causé des cauchemars — sur de nombreux projets réels. Voici pourquoi j’ai créé FastCSV-C : une bibliothèque CSV rapide et memory-safe en C, intégrable dans n’importe quel langage. Leçons sur FFI, mémoire et performance.

mars 2025

Laravel devient-il trop complexe ? Impact sur les développeurs et les entreprises

Laravel a beaucoup évolué, avec des outils comme Livewire, Inertia.js et Filament. Ces innovations apportent de la valeur, mais soulèvent aussi des questions sur la complexité, la maintenabilité et la stabilité à long terme. Cet article explore l’impact sur les juniors, les seniors et les dirigeants.