メモリを過負荷にすることなく、PHP 環境内で大きな MySQL ファイルを効率的に分割して実行するにはどうすればよいですか?

DDD
リリース: 2024-10-29 10:40:29
オリジナル
771 人が閲覧しました

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

PHP での MySQL ファイルのインポート: クエリを効果的に分割する

大きな MySQL ファイルを PHP ベースの Web サイトにインポートする場合、クエリを効率的に処理することが重要です。 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート