首页 >数据库 >mysql教程 >如何在PHP环境中高效地分割和执行大型MySQL文件而不造成内存过载?

如何在PHP环境中高效地分割和执行大型MySQL文件而不造成内存过载?

DDD
DDD原创
2024-10-29 10:40:29778浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn