將大型 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中文網其他相關文章!