Maison >base de données >tutoriel mysql >Comment puis-je diviser et exécuter efficacement des fichiers MySQL volumineux dans un environnement PHP sans surcharger la mémoire ?

Comment puis-je diviser et exécuter efficacement des fichiers MySQL volumineux dans un environnement PHP sans surcharger la mémoire ?

DDD
DDDoriginal
2024-10-29 10:40:29779parcourir

How can I efficiently split and execute large MySQL files within a PHP environment without overloading memory?

Importation de fichiers MySQL en PHP : fractionnement efficace des requêtes

Lors de l'importation de fichiers MySQL volumineux dans un site Web utilisant PHP, il est crucial de gérer efficacement les requêtes. Sans accès à la ligne de commande MySQL, diviser un fichier en requêtes uniques devient essentiel.

Solution respectueuse de la mémoire

La fonction suivante divise un gros fichier SQL en requêtes individuelles sans nécessiter que le fichier entier soit être chargé en mémoire :

<code class="php">function SplitSQL($file, $delimiter = ';')
{
    set_time_limit(0);

    if (is_file($file) === true)
    {
        $file = fopen($file, 'r');

        if (is_resource($file) === true)
        {
            $query = array();

            while (feof($file) === false)
            {
                $query[] = fgets($file);

                if (preg_match('~' . preg_quote($delimiter, '~') . '\s*$~iS', end($query)) === 1)
                {
                    $query = trim(implode('', $query));

                    if (mysql_query($query) === false)
                    {
                        echo '<h3>ERROR: ' . $query . '</h3>' . "\n";
                    }

                    else
                    {
                        echo '<h3>SUCCESS: ' . $query . '</h3>' . "\n";
                    }

                    while (ob_get_level() > 0)
                    {
                        ob_end_flush();
                    }

                    flush();
                }

                if (is_string($query) === true)
                {
                    $query = array();
                }
            }

            return fclose($file);
        }
    }

    return false;
}</code>

Cette fonction résout les pièges courants tels que les délimiteurs de champs et les sauts de ligne dans les champs mémo.

Tester les données et la sortie

Pour démontrer le fonctionnement de la fonction efficacité, considérez les données de test suivantes :

<code class="sql">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;</code>

L'exécution de la fonction SplitSQL sur ces données produit le résultat suivant :

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;

Cela démontre la fiabilité de la fonction dans la division précise des requêtes.

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