Maison  >  Article  >  base de données  >  Comment importer des fichiers MySQL volumineux en PHP : une solution efficace en mémoire avec une approche de requête fractionnée ?

Comment importer des fichiers MySQL volumineux en PHP : une solution efficace en mémoire avec une approche de requête fractionnée ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 04:50:30654parcourir

How to Import Large MySQL Files in PHP: A Memory-Efficient Solution with Split-Query Approach?

Importation d'un gros fichier MySQL en PHP : une solution complète de requêtes fractionnées

L'importation d'un gros fichier MySQL dans un site Web de fournisseur d'hébergement partagé peut être un défi, surtout lorsque vous utilisez PHP et que l'accès externe à MySQL est restreint. Cet article fournit une solution complète qui résout ce problème en divisant de manière fiable le fichier en requêtes individuelles pour l'importation.

Défis à prendre en compte

Lors de l'analyse et de l'interrogation d'un fichier MySQL volumineux en PHP, plusieurs défis se posent :

  • Détecter les délimiteurs de champs au sein des données
  • Gérer les sauts de ligne dans les champs mémo
  • Éviter les problèmes de mémoire dus à la grande taille des fichiers

Une solution fiable de requête fractionnée

Pour surmonter ces défis, cet article présente une fonction respectueuse de la mémoire appelée SplitSQL(). Cette fonction lit le fichier ligne par ligne et accumule les requêtes individuelles jusqu'à ce qu'un délimiteur de requête (tel qu'un point-virgule) soit rencontré. Voici le code :

function SplitSQL($file, $delimiter = ';') {
  set_time_limit(0);
  if (is_file($file) && is_resource($file = fopen($file, 'r'))) {
    $query = array();
    while (!feof($file)) {
      $query[] = fgets($file);
      if (preg_match('~' . preg_quote($delimiter, '~') . '\s*$~iS', end($query))) {
        $query = trim(implode('', $query));
        if (mysql_query($query) === false) {
          echo 'ERROR: ' . $query . "\n";
        } else {
          echo 'SUCCESS: ' . $query . "\n";
          flush();
        }
        $query = array();
      }
    }
    fclose($file);
    return true;
  }
  return false;
}

Convivial pour la mémoire et testé

Cette fonction alloue de la mémoire uniquement si nécessaire, évitant ainsi les problèmes de mémoire. Il a été testé sur de grandes sauvegardes SQL de phpMyAdmin, démontrant sa capacité à gérer efficacement les données du monde réel.

Tester les données et la sortie

Exemples de données et leur sortie respective à l'aide la fonction SplitSQL() :

Données de test :

CREATE TABLE IF NOT EXISTS "test" (
  "id" INTEGER PRIMARY KEY AUTOINCREMENT,
  "name" TEXT,
  "description" TEXT
);

BEGIN;
INSERT INTO "test" ("name", "description")
VALUES (";;;", "something for you mind; body; soul");
COMMIT;

UPDATE "test"
SET "name" = "; "
WHERE "id" = 1;

Sortie :

SUCCESS: CREATE TABLE IF NOT EXISTS "test" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT, "description" TEXT );
SUCCESS: BEGIN;
SUCCESS: INSERT INTO "test" ("name", "description") VALUES (";;;", "something for you mind; body; soul");
SUCCESS: COMMIT;
SUCCESS: UPDATE "test" SET "name" = "; " WHERE "id" = 1;

Conclusion

La fonction SplitSQL() fournit une solution robuste et fiable pour diviser les gros fichiers MySQL en requêtes individuelles, permettant une importation efficace et automatisée de bases de données dans des environnements d'hébergement partagé. En résolvant les contraintes de mémoire et en tenant compte de différents types de données, cette fonction simplifie le processus complexe d'importation de gros fichiers MySQL en PHP.

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