stickee / sync
Stickee 同步模块 - 同步数据库表
Requires
- php: ^8.1
- illuminate/support: ^9.0 || ^10.0 || ^11.0
- stickee/import: 2.2.0
Requires (Dev)
- orchestra/testbench: ^7.0 || ^8.0 || ^9.0
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
中填写 tables
和 directories
。
客户端(接收数据)的使用
配置
运行 php artisan vendor:publish --provider="Stickee\Sync\ServiceProvider"
以发布配置文件,然后在 sync-client.php
中填写 tables
和 directories
。在您的 .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 仓库加载模块,如下所示:
composer remove stickee/sync
- 编辑
composer.json
并添加
其中 "../sync" 是您检出此项目的路径"repositories": [ { "type": "path", "url": "../sync" } ]
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