Rumah >pangkalan data >tutorial mysql >Bagaimanakah saya boleh memisahkan dan melaksanakan fail MySQL yang besar dengan cekap dalam persekitaran PHP tanpa membebankan memori?

Bagaimanakah saya boleh memisahkan dan melaksanakan fail MySQL yang besar dengan cekap dalam persekitaran PHP tanpa membebankan memori?

DDD
DDDasal
2024-10-29 10:40:29779semak imbas

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

Mengimport Fail MySQL dalam PHP: Membahagikan Pertanyaan Dengan Berkesan

Apabila mengimport fail MySQL yang besar ke dalam tapak web berkuasa PHP, adalah penting untuk mengendalikan pertanyaan dengan cekap. Tanpa akses kepada baris arahan MySQL, pemisahan fail kepada pertanyaan tunggal menjadi penting.

Penyelesaian Mesra Memori

Fungsi berikut membahagikan fail SQL yang besar kepada pertanyaan individu tanpa memerlukan keseluruhan fail untuk dimuatkan ke dalam ingatan:

<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>

Fungsi ini menangani gotcha biasa seperti pembatas medan dan pemisah baris dalam medan memo.

Data dan Output Ujian

Untuk menunjukkan fungsi fungsi keberkesanan, pertimbangkan data ujian berikut:

<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>

Melaksanakan fungsi SplitSQL pada data ini menghasilkan output berikut:

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;

Ini menunjukkan kebolehpercayaan fungsi dalam membelah pertanyaan dengan tepat.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memisahkan dan melaksanakan fail MySQL yang besar dengan cekap dalam persekitaran PHP tanpa membebankan memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn