mnapoli / sqlite-s3
0.3.1
2024-01-01 16:06 UTC
Requires
- php: >=8.1
- ext-pdo: *
- ext-sqlite3: *
- async-aws/simple-s3: ^1|^2
- bref/bref: ^2.1.10
- bref/logger: ^1.0
Requires (Dev)
- laravel/framework: ^10.39
- mnapoli/hard-mode: ^0.3
- phpstan/phpstan: ^1
- phpunit/phpunit: ^10.5
README
为什么?
一个“无服务器”的SQL数据库
- 用于开发和测试目的
- 费用为0
- 尽可能简单易用
- 非常适合无服务器环境,例如AWS Lambda
不适用于生产用途。它不能处理并发更新(在这种情况下可能会丢失一些数据),并且性能不是生产级别的。
如何实现?
SQLite数据库(一个文件)存储在S3上。PHP类将在每次请求时透明地下载文件到本地,并在结束时上传回。
这有两个明显的后果
- 如果有两个并发请求下载数据库文件,更新它(分别),然后上传回,那么最后一个上传修改文件的人将覆盖其他请求的更改。
- 请求中增加了额外的延迟(并且它不适合大型数据库)。
这就是为什么这个解决方案最适合测试场景(例如,测试完全部署的应用程序,一次只运行一个测试)。它也可以用于只有一名活动用户的环境,在这种情况下,每个请求额外增加50ms-100ms是可以接受的。
设置
您需要一个AWS S3存储桶(数据库将存储在这里)。S3存储桶必须存在,但如果不存在,SQLite数据库文件将自动创建。
使用Composer安装包
composer require mnapoli/sqlite-s3
使用方法
使用Laravel
更新.env
(或设置环境变量)以设置
DB_CONNECTION=sqlite
DB_DATABASE='s3://the-s3-bucket-name/a-file-name.sqlite'
通常,DB_DATABASE
包含一个文件名,但在这里它将包含一个S3 URL。该URL将被自动检测以从S3检索数据库。
数据库将在每个请求上传到S3。当在Bref上运行AWS Lambda时,它将在每次AWS Lambda调用时上传/同步。
Lambda之外(例如在测试代码中),调用DB::purge();
以强制数据库同步到S3。
通用PHP应用程序
代替
$db = new PDO('sqlite:test-db.sqlite'); $db->exec('SELECT * FROM my-table');
使用
$db = new PDOSQLiteS3('the-s3-bucket-name', 'a-file-name.sqlite'); $db->exec('SELECT * FROM my-table');
当销毁$db
实例(即关闭PDO连接时),数据库将上传回S3。
配置
如果需要,设置AWS区域
$db = new PDOSQLiteS3('the-s3-bucket-name', 'a-file-name.sqlite', [ 'region' => 'us-east-1', ]);
AWS凭据将自动由AWS SDK拾取。《Async-AWS》库在底层使用,请参阅其文档。
没有PDO
如果您直接使用SQLite3
类,请将其替换为SQLiteS3
类
$db = new SQLiteS3('the-s3-bucket-name', 'a-file-name.sqlite');