大きな 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 サイトの他の関連記事を参照してください。