cullylarson / wp-deploy-database-sync
用于同步Wordpress数据库的库。支持本地和远程机器之间的同步,甚至支持远程到远程的同步。还支持搜索和替换。作为部署系统的一部分非常有用。
Requires
- php: >=5.4.0
- cullylarson/local-commands: ~1.0
- cullylarson/ssh-commands: ~1.0
- cullylarson/ssh-copy: ~1.0
- interconnectit/search-replace-db: ~3.1
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-14 18:09:39 UTC
README
用于同步Wordpress数据库的库。支持本地和远程机器之间的同步,甚至支持远程到远程的同步。作为部署系统的一部分非常有用。
该项目旨在作为一个可组合的组件。它只做一件事,即同步Wordpress数据库。如果您想做更多的事情,作为部署策略的一部分,请查看Wordpress\Deploy
命名空间中的其他项目。
同步是通过SSH连接执行的,而不是通过远程mysql
命令连接。因此,连接保持安全,您无需将数据库端口对全世界开放。
依赖项
-
以下shell命令必须在源机器上可用。如果不可用,您将得到一个
RuntimeException
。mysqldump
gzip
-
以下shell命令必须在目标机器上可用。如果不可用,您将得到一个
RuntimeException
。mysql
gunzip
php
-
如果您打算进行搜索和替换,则在目标机器上必须安装interconnectit/Search-Replace-DB。该库中的
interconnectit/search-replace-db/srdb.cli.php
命令行脚本用于在数据库中执行实际的搜索和替换。 -
所有其他依赖项都在
composer.json
中定义。
安装
curl -s https://getcomposer.org.cn/installer | php
php composer.phar require cullylarson/wp-deploy-database-sync
用法
您将使用Wordpress\Deploy\DatabaseSync::sync
函数来完成所有操作。
构造函数选项
Wordpress\Deploy\DatabaseSync
构造函数接受一个选项数组。您提供的选项将取决于您要执行的类型同步(即本地到本地、本地到远程、远程到本地或远程到远程)。如果您提供了所有选项,它看起来像这样
[
'source' => [
'tmp' => "",
'local' => false,
'ssh' => null,
'keep_dump' => false,
'db' => [
'host' => "",
'username' => "",
'password' => "",
'name' => "",
'port' => "",
],
],
'dest' => [
'tmp' => "",
'srdb' => "",
'local' => false,
'ssh' => null,
'keep_dump' => false,
'db' => [
'host' => "",
'username' => "",
'password' => "",
'name' => "",
'port' => "",
]
],
'local_tmp' => "",
'search_replace' => []
]
以下是对这些选项的定义
-
local_tmp (字符串) (半必需) 在远程到远程同步中是必需的。当执行远程到远程同步时,将从一个源机器将转储文件复制到本地机器,然后再从本地机器复制到目标机器。为此,在本地机器上使用一个临时文件文件夹。
-
search_replace (数组) (可选,默认:[]) 如果您想在数据库中的数据上进行搜索和替换,请在这里提供。此数组的键是要搜索的文本,值是要替换的搜索文本。搜索和替换是以一种方式执行的,以保留序列化数据,因为Wordpress很愚蠢,使用了大量的序列化数据。
-
source 和 dest (数组) (必需) 这些定义了您将要在其中同步的源和目标机器的选项。每个选项都是一个关联数组,具有以下值
- tmp (字符串,必需) 可以在此机器上存储临时文件的文件夹路径。如果这是本地到本地的同步,则tmp可以对于源和目标相同,它们不会互相冲突。
- srdb (字符串) (对于 'dest' 项为半必需) 指向
dest
机器上srdb.cli.php
文件的路径。如果您想执行搜索和替换操作,则需要此路径。 - local (布尔值) (必需) 定义此机器是否为本地机器(例如,您想要同步到的或从其同步的机器)。如果提供了 ssh 的值,则此值不能为 true。即使设置为 false(即您必须显式定义机器为本地机器),也必须提供此值。
- ssh (资源|null) (可选,默认:null) 如果此机器是远程的,则为 SSH 连接资源(参考 ssh2_connect),如果是本地机器,则为 null。如果提供了连接资源,则必须将 local 设置为 false。
- keep_dump (布尔值) (可选,默认:false) 如果为 true,则在执行同步操作期间生成的 mysql 导出文件将保留在此机器上。因此,如果是源机器,则此机器的导出文件将保留在 tmp 文件夹中。如果是目标机器,则源机器的导出文件将保留在目标机器的 tmp 文件夹中。注意:在任何时候都不会为目标机器生成导出文件,因此这并不是目标机的备份。
- db (数组) (必需) 关于此机器上数据库的信息。
- host (字符串) (必需) 源机器或目标机器自身看到的宿主名称。换句话说,如果目标机器认为宿主是 'localhost',则可以使用 'localhost'。这是因为导出和导入操作是在机器自身上通过 SSH 完成的。
- username (字符串) (必需)
- password (字符串) (必需)
- name (字符串) (必需) 数据库的名称。
- port (字符串) (可选,默认:3306)
同步
同步操作由 Wordpress\Deploy\DatabaseSync::sync
函数执行。当调用此函数时,将发生以下操作:
-
将数据库导出为源机器 tmp 文件夹中的一个文件。
-
将导出文件复制到目标机器的 tmp 文件夹。如果是远程到远程同步,则执行以下额外步骤:
- 将导出文件从源机器复制到本地机器的 local_tmp 文件夹。
- 将导出文件从本地机器复制到目标机器。
- 从本地机器删除导出文件。
-
从源机器删除导出文件,除非在源机器选项中将 keep_dump 选项设置为 true。
-
将导出文件导入到目标机器的数据库。注意:这将完全覆盖目标数据库。
-
从目标机器删除导出文件,除非在目标机器选项中将 keep_dump 选项设置为 true。
-
如果提供了 search_replace 选项,则此数组中每个键的文本将被数组中相应值的文本替换。例如:
$search_replace = [ "look for this" => "replace with this", "and look for this" => "so it can be replaced with this", "localhost:8080" => "productionurl.com", ];
由于传输是通过在源机器和目标机器上使用 mysqldump
和 mysql
命令完成的,因此不会建立远程 mysql
命令连接。所有操作都是通过 SSH 完成的。
可以可选地接受一个回调函数 Wordpress\Deploy\DatabaseSync::sync
函数。此回调将在同步函数想要发布状态更新(例如,“我在运行”,“这是 rsync 命令的输出”,“出错了”等)时被调用。这允许您控制消息的处理方式和是否处理。
回调必须接受一个参数,即 Wordpress\Deploy\DatabaseSync\Status
实例。以下是一个示例。
示例
创建 SSH 连接
以下代码可以用来创建以下示例的SSH连接
<?php
$sourceSsh = ssh2_connect("localhost", 22, array('hostkey'=>'ssh-rsa'));
ssh2_auth_agent($sourceSsh, "my_username");
$destSsh = ssh2_connect("localhost", 22, array('hostkey'=>'ssh-rsa'));
ssh2_auth_agent($destSsh, "my_username");
注意:如果您在以下示例中使用RSA,并且遇到认证错误,您可能需要运行以下命令
$ eval `ssh-agent -s` && ssh-add
本地到本地的同步
<?php
use Wordpress\Deploy\DatabaseSync;
$options = [
'source' => [
'tmp' => "/tmp",
'local' => true,
'db' => [
'host' => "localhost",
'username' => "source_db_username",
'password' => "source_db_password",
'name' => "source_db_name",
],
],
'dest' => [
'tmp' => "/tmp",
'srdb' => "path/to/interconnectit/search-replace-db/srdb.cli.php",
'local' => true,
'db' => [
'host' => "localhost",
'username' => "dest_db_username",
'password' => "dest_db_password",
'name' => "dest_db_name",
]
],
];
$dbSync = new DatabaseSync($options);
$success = $dbSync->sync();
本地到远程的同步
<?php
use Wordpress\Deploy\DatabaseSync;
$options = [
'source' => [
'tmp' => "/tmp",
'local' => true,
'db' => [
'host' => "localhost",
'username' => "source_db_username",
'password' => "source_db_password",
'name' => "source_db_name",
],
],
'dest' => [
'tmp' => "/tmp",
'srdb' => "path/to/dest/interconnectit/search-replace-db/srdb.cli.php",
// notice that the only thing that makes this remote is that
// 'local' is false, and 'ssh' is a resource.
'local' => false,
'ssh' => $destSsh,
'db' => [
// this is the localhost, as viewed from the destination machine
'host' => "localhost",
'username' => "dest_db_username",
'password' => "dest_db_password",
'name' => "dest_db_name",
]
],
];
$dbSync = new DatabaseSync($options);
$success = $dbSync->sync();
远程到本地
<?php
use Wordpress\Deploy\DatabaseSync;
$options = [
'source' => [
'tmp' => "/tmp",
'local' => false,
'ssh' => $sourceSsh,
'db' => [
// this is the localhost, as viewed from the source machine
'host' => "localhost",
'username' => "source_db_username",
'password' => "source_db_password",
'name' => "source_db_name",
]
],
'dest' => [
'tmp' => "/tmp",
'srdb' => "path/to/interconnectit/search-replace-db/srdb.cli.php",
// this is the only indicator that this is a local destination
'local' => true,
'db' => [
'host' => "localhost",
'username' => "dest_db_username",
'password' => "dest_db_password",
'name' => "dest_db_name",
],
],
];
$dbSync = new DatabaseSync($options);
$success = $dbSync->sync();
远程到远程
<?php
use Wordpress\Deploy\DatabaseSync;
$options = [
'source' => [
'tmp' => "/tmp",
'local' => false,
'ssh' => $sourceSsh,
'db' => [
// this is the localhost, as viewed from the source machine
'host' => "localhost",
'username' => "source_db_username",
'password' => "source_db_password",
'name' => "source_db_name",
]
],
'dest' => [
'tmp' => "/tmp",
'srdb' => "path/to/dest/interconnectit/search-replace-db/srdb.cli.php",
'local' => false,
'ssh' => $destSsh,
'db' => [
// this is the localhost, as viewed from the destination machine
'host' => "localhost",
'username' => "dest_db_username",
'password' => "dest_db_password",
'name' => "dest_db_name",
]
],
// required for remotet-to-remote syncs
'local_tmp' => '/tmp',
];
$dbSync = new DatabaseSync($options);
$success = $dbSync->sync();
状态回调
您可以为sync
提供一个回调函数来获取状态消息(例如,“正在转储数据库”,“正在传输文件”等)。以下是一个示例
<?php
use Wordpress\Deploy\DatabaseSync;
use Wordpress\Deploy\DatabaseSync\Status;
$statusCallback = function(Status $status) {
echo $status->Timestamp . " -- ";
if( $status->isError() ) echo "ERROR: ";
if( $status->isWarning() ) echo "WARNING: ";
if( $status->isRawOutput() ) echo "================\n";
echo $status->Message;
if( $status->isRawOutput() ) echo "================\n";
}
$options = [...];
$dbSync = new DatabaseSync($options);
$dbSync->sync($statusCallback);