如何在PHP環境中高效率地分割和執行大型MySQL檔案而不造成記憶體過載?

DDD
發布: 2024-10-29 10:40:29
原創
770 人瀏覽過

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

在 PHP 中匯入 MySQL 檔案:有效分割查詢

將大型 MySQL 檔案匯入 PHP 驅動的網站時,高效處理查詢至關重要。如果無法存取 MySQL 命令列,則將檔案拆分為單一查詢變得至關重要。

記憶體友善的解決方案

以下函數將大型SQL 檔案分割為單一查詢,而不需要整個檔案載入記憶體:

<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>
登入後複製

此函數解決了常見問題,例如備註欄位中的欄位分隔符號和換行符。

測試資料和輸出

示範函數的有效性,考慮以下測試資料:

<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>
登入後複製

對此資料執行SplitSQL 函數會產生以下輸出:

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;
登入後複製

這證明了函數準確拆分查詢的可靠性。

以上是如何在PHP環境中高效率地分割和執行大型MySQL檔案而不造成記憶體過載?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板