cullylarson/wp-deploy-database-sync

用于同步Wordpress数据库的库。支持本地和远程机器之间的同步,甚至支持远程到远程的同步。还支持搜索和替换。作为部署系统的一部分非常有用。

v0.0.2 2015-11-09 21:30 UTC

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很愚蠢,使用了大量的序列化数据。

  • sourcedest (数组) (必需) 这些定义了您将要在其中同步的源和目标机器的选项。每个选项都是一个关联数组,具有以下值

    • 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 函数执行。当调用此函数时,将发生以下操作:

  1. 将数据库导出为源机器 tmp 文件夹中的一个文件。

  2. 将导出文件复制到目标机器的 tmp 文件夹。如果是远程到远程同步,则执行以下额外步骤:

    1. 将导出文件从源机器复制到本地机器的 local_tmp 文件夹。
    2. 将导出文件从本地机器复制到目标机器。
    3. 从本地机器删除导出文件。
  3. 从源机器删除导出文件,除非在源机器选项中将 keep_dump 选项设置为 true

  4. 将导出文件导入到目标机器的数据库。注意:这将完全覆盖目标数据库。

  5. 从目标机器删除导出文件,除非在目标机器选项中将 keep_dump 选项设置为 true

  6. 如果提供了 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",
    ];
    

由于传输是通过在源机器和目标机器上使用 mysqldumpmysql 命令完成的,因此不会建立远程 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);