PHP Conference Japan 2024

PDO_SQLITE DSN

(PHP 5 >= 5.1.0, PHP 7, PECL PDO_SQLITE >= 0.2.0)

PDO_SQLITE DSN连接到 SQLite 数据库

描述

PDO_SQLITE 数据源名称 (DSN) 由以下元素组成

DSN 前缀 (SQLite 3)

DSN 前缀为 sqlite:

  • 要访问磁盘上的数据库,必须将绝对路径附加到 DSN 前缀。

  • 要创建内存中的数据库,必须将 :memory: 附加到 DSN 前缀。

  • 如果 DSN 仅由 DSN 前缀组成,则使用临时数据库,该数据库在连接关闭时删除。

示例

示例 #1 PDO_SQLITE DSN 示例

以下示例显示了用于连接到 SQLite 数据库的 PDO_SQLITE DSN

sqlite:/opt/databases/mydb.sq3
sqlite::memory:
sqlite:

添加注释

用户贡献的注释 5 个注释

frederic dot glorieux at diple dot net
13 年前
内存中的 sqlite 有一些限制。内存空间可能是请求、会话,但似乎没有记录在用户之间共享基本内存的方法。

对于请求,请使用以下代码打开您的数据库
$pdo = new PDO( 'sqlite::memory:');
您的数据库将在下一个请求中消失。

对于会话持久性
<?php
$pdo
= new PDO(
'sqlite::memory:',
null,
null,
array(
PDO::ATTR_PERSISTENT => true)
);
?>
rick
18 年前
不要忘记在 php.ini 中启用“extension=php_pdo_sqlite.dll”(如果您使用 xampp,则默认情况下将禁用它)。
Fatmoon
16 年前
似乎包含 SQLite 数据库的目录必须可由 Web 服务器写入。仅使文件可写不起作用。
casteele at g-m-a-i-l ( dot ) c-o-m
8 年前
一些可能显而易见也可能不明显的注释..

通常,当在 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 的限制,而是操作系统通常如何在线程/用户/连接/等等之间共享有限资源(如内存)。
FST777
16 年前
@ Fatmoon
这是正确的。SQLite 有时在写入数据库时会使用同一文件夹中的其他文件。有时可以看到这些文件,并且通常包含您的数据库名称及其文件名中的“journal”一词。
从安全的角度来看,最好将 SQLite 数据库存储在单独的文件夹中,以保护其余部分免受用户 www 的影响。
To Top