内存中的 sqlite 有一些限制。内存空间可以是请求、会话,但似乎没有文档说明如何在用户之间共享内存中的基础。
对于请求,使用以下代码打开您的基础
$pdo = new PDO( 'sqlite::memory:');
您的基础将在下一个请求中消失。
对于会话持久性
<?php
$pdo = new PDO(
'sqlite::memory:',
null,
null,
array(PDO::ATTR_PERSISTENT => true)
);
?>
(PHP 5 >= 5.1.0, PHP 7, PECL PDO_SQLITE >= 0.2.0)
PDO_SQLITE DSN — 连接到 SQLite 数据库
PDO_SQLITE 数据源名称 (DSN) 由以下元素组成
DSN 前缀为 sqlite:
。
要访问磁盘上的数据库,必须将绝对路径附加到 DSN 前缀。
要创建内存中的数据库,必须将 :memory:
附加到 DSN 前缀。
如果 DSN 仅包含 DSN 前缀,则使用临时数据库,该数据库在连接关闭时删除。
示例 #1 PDO_SQLITE DSN 示例
以下示例显示了用于连接到 SQLite 数据库的 PDO_SQLITE DSN
sqlite:/opt/databases/mydb.sq3 sqlite::memory: sqlite:
内存中的 sqlite 有一些限制。内存空间可以是请求、会话,但似乎没有文档说明如何在用户之间共享内存中的基础。
对于请求,使用以下代码打开您的基础
$pdo = new PDO( 'sqlite::memory:');
您的基础将在下一个请求中消失。
对于会话持久性
<?php
$pdo = new PDO(
'sqlite::memory:',
null,
null,
array(PDO::ATTR_PERSISTENT => true)
);
?>
一些可能显而易见或可能不显而易见的注意事项。
通常,在 PHP 脚本中(例如 Web 服务器的 index.php 文件中的代码)使用内存中 (:memory:) 数据库时,用于数据库的内存仅在 PHP 代码运行时存在。通常,这仅仅是将输出传回尝试为客户端提供网页的 Web 服务器所需的时间。据我所知,没有办法(请纠正我如果我错了)在不同的 Web 连接(包括来自同一客户端的不同多个连接)之间共享内存中数据库。*这包括“持久”连接。*原因是内存中数据库 *是* 内存中数据库,并且由 Web 服务器/PHP 处理器分配的内存是在“动态”分配和释放的。否则,提供数千个网页的 Web 服务器将很快消耗所有可用内存(和交换空间),并在系统不再有可用内存来处理更多请求时停止运行。
如果您需要在会话、连接或脚本之间共享数据,则需要在对 Web 服务器/PHP 扩展可写的文件夹/目录中使用数据库文件,因为 SQLite3 在使用数据库时可能会使用一些临时文件。(在我的 Debian Linux 安装中,这是“www-data”伪用户/组。)(如果您想了解它使用的临时文件,可以查阅 SQLite3 文档;它们有很好的文档。)
简而言之,将内存中数据库视为除非常短期的临时数据库以外的任何其他东西都是一个 *逻辑错误*。如果您只想在一个 *单个网页内* 操作更大数据库的一个子集,*并且仅在 PHP 脚本生成网页时*,它们可能很有用。也就是说,您不能使用内存中数据库来存储用户的“购物车”,例如,因为购物车仍然需要加载许多不同的网页,调用许多不同的 PHP 脚本,每个脚本都有自己的内存空间。同样,一旦 PHP 为服务器生成网页的输出以发送给客户端,PHP 就 *不再是“画面的一部分”*,并且它分配的任何内存都可以释放用于其他用途——包括您的内存中数据库。
这不是 Web 服务器、PHP 或 SQLite 的限制,而是操作系统在进程/用户/连接等之间共享有限资源(如内存)的一般工作方式。