stickee/sync

Stickee 同步模块 - 同步数据库表

v3.0.3 2024-05-07 14:28 UTC

This package is auto-updated.

Last update: 2024-09-07 15:23:09 UTC


README

这是一个用于在两个服务器之间同步文件或数据库表的 composer 模块。

注意:在导入期间禁用了外键检查

安装

composer require stickee/sync

此模块包含一个 Laravel 服务提供器,它将被自动注册。

手动注册

可以通过将以下内容添加到 config/app.php 文件中的 providers 数组来手动注册此模块:

\Stickee\Sync\ServiceProvider::class,

服务器(发送数据)的使用

通过调用 \Stickee\Sync\ServiceProvider::routes(); 将路由添加到您的 routes/api.php。您通常需要添加 URL 前缀并添加某种形式的身份验证,例如:

Route::middleware('auth:api')
    ->prefix('sync')
    ->name('sync.')
    ->group(function () {
        \Stickee\Sync\ServiceProvider::routes();
    });

配置

运行 php artisan vendor:publish --provider="Stickee\Sync\ServiceProvider" 以发布配置文件,然后在 sync-server.php 中填写 tablesdirectories

客户端(接收数据)的使用

配置

运行 php artisan vendor:publish --provider="Stickee\Sync\ServiceProvider" 以发布配置文件,然后在 sync-client.php 中填写 tablesdirectories。在您的 .env 文件中设置以下内容:

  • SYNC_API_URL: 服务器 URL,例如 https://example.com/api/sync

如果您已添加身份验证,则需要使 Guzzle 客户端进行身份验证。对于 api-token 身份验证,将以下内容添加到您的 config/sync-client.php

'api_key' => env('SYNC_API_KEY'),

并在您的 .env 文件中添加 SYNC_API_KEY=XXXXXXX

然后,在 AppServiceProvider::register() 中添加

app()->when(\Stickee\Sync\Client::class)
    ->needs(\GuzzleHttp\Client::class)
    ->give(function () {
        $config = [
            'headers' => [
                'Authorization' => 'Bearer ' . \Stickee\Sync\Helpers::clientConfig('api_key'),
                'Accept' => 'application/json',
            ],
        ];

        return new \GuzzleHttp\Client($config);
    });

命令

此包提供了 php artisan sync:sync 命令,用于从命令行运行同步。

开发

最简单的方法是将导入模块的项目配置为从文件系统而不是 composer 仓库加载模块,如下所示:

  1. composer remove stickee/sync
  2. 编辑 composer.json 并添加
    "repositories": [
        {
            "type": "path",
            "url": "../sync"
        }
    ]
    
    其中 "../sync" 是您检出此项目的路径
  3. composer require stickee/sync@dev

注意:不要以这种方式将 composer.json 检入版本控制!

数据库表

方法 1

  • 客户端对表的本地副本进行散列
  • 客户端向服务器发送 getTableHash 请求
  • 如果散列相同,则无需执行任何操作,停止
  • 客户端发送 getTable 请求
  • 客户端导入响应,将其合并到现有表中

方法 2

  • 客户端对表的本地副本进行散列
  • 客户端向服务器发送包含散列的 getTable 请求
  • 如果散列相同,服务器将响应 304 Not Modified
  • 客户端导入响应,将其合并到现有表中

可以使用实现 \Stickee\Sync\Interfaces\TableHasherInterface 的类对表进行散列

文件

  • 客户端对其文件的本地副本进行散列
  • 客户端向服务器发送 getFileHashes 请求
  • 客户端比较散列并构建需要删除/下载的文件的列表
  • 客户端删除多余的文件
  • 客户端将获取文件的列表分成块
  • 对于每个块,客户端发送 getFiles 请求
  • 文件保存到磁盘

测试

首先将 phpunit.xml.dist 复制到 phpunit.xml 并填写您的 MySQL 数据库详细信息。使用以下命令运行单元测试:

./vendor/bin/phpunit -v