Traitement des big data en PHP : du mythe au projet réel

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

PHP et Big Data : pas un oxymore, mais une réalité



Quand on entend "traitement des big data", la première chose qui vient à l'esprit, ce sont Spark, Hadoop ou Python avec Pandas. PHP dans cette liste est généralement perçu comme "un langage pour les landing pages et les forums". Mais regardons la vérité en face : si votre projet vit déjà sur PHP, le réécrire entièrement en Go pour une seule tâche de traitement d'un CSV de plusieurs gigaoctets, c'est tirer au canon sur des moineaux.



PHP gère très bien les Big Data, si on aborde la question intelligemment. Dans cet article, nous allons décortiquer des techniques concrètes : comment ne pas faire planter le serveur en travaillant avec des fichiers de 10+ Go, comment traiter des millions de lignes depuis une base de données sans out of memory, et comment transformer PHP en un véritable pipeline de données. Sans blabla, que du code et des décisions architecturales.



Pourquoi PHP "n'aime pas" les big data (et comment y remédier)



Le principal problème de PHP dans le contexte des Big Data est son modèle d'exécution. Le script s'exécute séquentiellement, en chargeant tout en mémoire. Essayez de faire file_get_contents() sur un fichier de 5 Go – le serveur va simplement planter.



Mais il y a une bonne nouvelle : PHP dispose de mécanismes intégrés pour le traitement par flux. Il suffit d'oublier les méthodes "barbares" comme file() ou file_get_contents() et de passer aux générateurs, flux et requêtes par chunks.



Les générateurs : votre outil principal



Les générateurs (mot-clé yield) permettent de retourner les données un élément à la fois, sans charger l'ensemble en mémoire. C'est idéal pour lire de gros fichiers ou des extractions de base de données.



Exemple : lisons un fichier CSV de 5 Go ligne par ligne, sans tuer la mémoire :



<?phpfunction readLargeCSV(string $filePath): Generator{    $handle = fopen($filePath, 'r');    if ($handle === false) {        throw new RuntimeException("Impossible d'ouvrir le fichier : $filePath");    }

// Ignorer le BOM s'il existe $bom = fread($handle, 3); if ($bom !== "\\xEF\\xBB\\xBF") { rewind($handle); // Si pas de BOM, revenir au début }

while (($row = fgetcsv($handle, 0, ',')) !== false) { yield $row; }

fclose($handle);}

// Utilisationforeach (readLargeCSV('/data/orders_2024.csv') as $index => $row) { // Traiter chaque ligne une par une if ($index === 0) { continue; // ignorer l'en-tête } processOrder($row);}?>


Pourquoi ça marche ? Le générateur ne charge pas tout le fichier dans un tableau. Il lit une ligne – la renvoie – lit la suivante. La consommation mémoire reste de quelques kilo-octets, quelle que soit la taille du fichier.



Travailler avec de grandes bases de données : les requêtes par chunks



Si vous devez traiter 5 millions d'enregistrements depuis MySQL, n'essayez pas de faire SELECT * FROM table – cela tuera à la fois la BDD et PHP. Utilisez plutôt des curseurs ou des requêtes par chunks.



Voici la bonne approche avec PDO et l'itération par chunks :



<?phpfunction processLargeTable(PDO $pdo, int $chunkSize = 1000, callable $callback): void{    $offset = 0;    $lastId = 0;

// Utiliser ORDER BY id pour la stabilité $stmt = $pdo->prepare("SELECT * FROM orders WHERE id > :lastId ORDER BY id LIMIT :limit");

do { $stmt->execute(['lastId' => $lastId, 'limit' => $chunkSize]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (empty($rows)) { break; }

foreach ($rows as $row) { $callback($row); $lastId = $row['id']; // Mémoriser le dernier ID traité }

// Libérer la mémoire unset($rows); $stmt->closeCursor();

} while (true);}

// Utilisation$pdo = new PDO('mysql:host=localhost;dbname=big_data', 'user', 'pass');$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

p

Blogs

Book Recommendations