vielhuber/magicreplace

一个零开销的搜索/替换类。

1.5.8 2024-04-23 12:27 UTC

README

build status

✨ magicreplace ✨

magicreplace 是一个数据库迁移的搜索替换工具。

简介

问题

当迁移数据库时,通常 URL 环境也会改变。如果 URL 在数据库中硬编码(如 WordPress 所述),则必须更改这些 URL。如果您现在对整个数据库进行搜索和替换以更改 URL,则可能会损坏序列化的数据。只需尝试

unserialize(str_replace('www.foo.tld', 'www.barrr.tld', serialize('url=www.foo.tld')));

并将获得一个丑陋的错误。

已经存在一些很酷的工具可以解决这个问题,例如...

magicreplace 与这些工具有何不同?

  • 速度快(100MB 数据库文件,300,000 行的运行时间约为 5 秒)
  • 轻量级:仅小于 10KB
  • 在内存限制设置小的文件上也能工作
  • 基于文件:不需要数据库或 wp 安装 - 可以在纯(sql)文件上工作
  • 本地使用:不需要远程服务器或网络服务
  • 多替换:执行多个替换
  • 考虑边缘情况:可以处理对象甚至引用
  • 忽略在运行时不可用的类
  • 可以用命令行或作为类使用
  • 操作谨慎:如果序列化失败,则不做任何更改
  • 永不更改数据(超出范围的整数保留,自动生成的日期不更新)
  • 将其工作分成几部分以克服 php 限制
  • 支持特殊 base64 字符串中的替换(例如在 BeTheme 中)

免责声明

这并不免除您进行备份的责任。使用此脚本风险自负!

命令行

要求

Mac
brew install coreutils
Windows

使用 WSL/WSL2/Cygwin 运行即可。

Linux

安装

wget https://raw.githubusercontent.com/vielhuber/magicreplace/master/src/magicreplace.php

使用

php magicreplace.php input.sql output.sql search-1 replace-1 search-2 replace-2

安装

composer require vielhuber/magicreplace

使用

<?php
require __DIR__ . '/vendor/autoload.php';
use vielhuber\magicreplace\magicreplace;
magicreplace::run('input.sql', 'output.sql', ['search-1' => 'replace-2', 'search-2' => 'replace-2']);

推荐替换策略

例如,如果您想将 http://www.foo.tld 替换为 https://www.bar.tld,最安全的方法是使用以下替换(按给定顺序)

  • http://www.foo.tld https://www.bar.tld
  • https://www.foo.tld https://www.bar.tld
  • http://foo.tld https://www.bar.tld
  • https://foo.tld https://www.bar.tld
  • www.foo.tld www.bar.tld
  • foo.tld bar.tld

测试

只需将这些 3 个文件放置在 tests/data 的子文件夹中(可选嵌套)

  • input.sql:所需的输入文件
  • output.sql:所需的输出文件
  • settings.sql:定义您的替换

示例 settings.sql 文件

{
    "replace": {
        "http://www.foo.tld": "https://www.bar.tld",
        "https://www.foo.tld": "https://www.bar.tld"
    }
}

如果测试失败,预期的输出将存储在 expected.sql 中。

您甚至可以自动生成测试用例(比较 magicreplace 与 Search-Replace-DB,并且只给出差异)如果您省略 input.sqloutput.sql,并定义一个从本地导出的 MySQL 数据库。示例 settings.sql 文件

{
    "source": {
        "host": "localhost",
        "port": "3306",
        "database": "xxx",
        "username": "xxx",
        "password": "xxx",
    },
    "replace": {
        "http://www.foo.tld": "https://www.bar.tld",
        "https://www.foo.tld": "https://www.bar.tld"
    }
}

input.sqloutput.sql 然后会自动生成。在您重新运行测试之后,这些生成的文件会被使用。如果您想再次生成它们,只需在运行测试之前删除它们即可。您还可以提供一个 whitelist.sql 文件,其中包含应忽略的所有来自 input.sql 的行(例如,当 magicreplace 与 Search-Replace-DB 的行为不同时)。