【问题标题】:PHP PDO Read SQLLite DB From Memory (variable)PHP PDO 从内存中读取 SQLite DB(变量)
【发布时间】:2019-06-20 02:02:25
【问题描述】:

这里是场景

客户端应用程序,准备数据,制作 SQLite db,压缩它(zip),编码 zip 文件并发送到服务器。

现在,在服务器端,我对 zip 文件进行解码,然后解压缩,将 SQLite db 数据存储到 $strLiteData 之类的变量中。

现在我需要使用 PDO 使用该变量/数据,但 PDO 似乎只支持真实文件或“内存”。

所以,唯一的选择是我必须先将 SQLite db 数据保存到文件中,然后再加载该文件。为了保持唯一性,我必须为此创建唯一的文件夹、文件等。

有没有办法使用PDO直接从变量中读取?

【问题讨论】:

  • 您可以在 C 中使用正确的扩展模块来实现,但大多数语言的 sqlite 绑定不提供这种功能或灵活性。更容易将数据保存为文件并以正常方式打开。
  • 有了所有的实现开销,必须有一个正确的文件/唯一的文件名似乎可以忽略不计。

标签: php sqlite memory pdo


【解决方案1】:

在大多数机器上,临时文件是在内存中创建的,因此我们基本上可以将数据库从内存中的一个位置复制到另一个位置,这就是直接从变量加载数据库所要做的事情。

为了保持唯一性,我必须为此创建唯一的文件夹、文件等。

让 PHP 使用 tmpfile() 处理唯一性。尽管该文件通常对所有用户可见(在 Linux 上,默认位于 /tmp),但该值只能由当前用户访问,并且文件名总是像 php8c1vRQ 这样的不起眼的东西。

这是一个示例,当您完成运行查询时将结果存储回 $strLiteData:

$strLiteData = /* from your zip file */

$dbFile = tmpfile();
$dbPath = stream_get_meta_data($dbFile)['uri'];

fwrite($dbFile, $strLiteData);

$pdo = new PDO('sqlite:' . $dbPath);

/*
 * do your PDO stuff here
 */

$strLiteData = file_get_contents($dbPath);

脚本结束时PHP会自动删除临时文件。

【讨论】:

  • 先生,您使用 fwrite 存储文件数据,如果我使用 file_put_contents 怎么办?希望也会这样做......
  • @Zakir_SZH 是的,它会做同样的事情。我使用fwrite() 的原因是它比使用file_put_contents() 的字符更少,但任何一个都可以。只要确保在完成 PDO 内容并将数据读回$strLiteData 之前不要使用fclose() $dbFile 资源,因为fclose() 将删除临时文件。
猜你喜欢
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2021-08-04
  • 2016-09-22
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多