mnapoli/sqlite-s3

资助包维护!
mnapoli

0.3.1 2024-01-01 16:06 UTC

This package is auto-updated.

Last update: 2024-08-30 17:30:02 UTC


README

为什么?

一个“无服务器”的SQL数据库

  • 用于开发和测试目的
  • 费用为0
  • 尽可能简单易用
  • 非常适合无服务器环境,例如AWS Lambda

不适用于生产用途。它不能处理并发更新(在这种情况下可能会丢失一些数据),并且性能不是生产级别的。

如何实现?

SQLite数据库(一个文件)存储在S3上。PHP类将在每次请求时透明地下载文件到本地,并在结束时上传回。

这有两个明显的后果

  1. 如果有两个并发请求下载数据库文件,更新它(分别),然后上传回,那么最后一个上传修改文件的人将覆盖其他请求的更改。
  2. 请求中增加了额外的延迟(并且它不适合大型数据库)。

这就是为什么这个解决方案最适合测试场景(例如,测试完全部署的应用程序,一次只运行一个测试)。它也可以用于只有一名活动用户的环境,在这种情况下,每个请求额外增加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');