内存中的 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 的限制,而是操作系统通常如何在线程/用户/连接/等等之间共享有限资源(如内存)。