【问题标题】:serialize vs SQLite in Php在 PHP 中序列化与 SQLite
【发布时间】:2011-02-07 10:12:26
【问题描述】:

我想将数组存储在文件中。 我尝试使用 csv(fgetcsvfputcsv),但遇到与语言环境相关的大量错误。我不能继续使用这个。 我使用序列化,但编辑非常困难。还有一个与\r相关的bug。

我正在寻找一种更好的国际化方式来将变量存储在文件中。

SQLite 可以解决。我想知道 SQLite 与 MySQL 或基本序列化相比的性能。另外,如果有错误我会遇到。

注意事项:

  1. 数组是二维数组。与 DB 结构中的 table->fields 相同。
  2. 我不想安装额外的程序,可移植性是真正的问题,因为人们可以安装到任何服务器上,PHP、MySQL 应该足够了。
  3. 为什么我不想存储在 MySQL 中,因为我将使用这种结构来提供缓存。我想要发布的最终产品在大多数情况下都可以在没有 DB 的情况下运行。
  4. 我使用fgetcsv & fputcvs 编写了一个基本结构。有bug!它剥离了一些字符。这就是我寻找替代品的原因。我不想从头开始发明整个轮子,但是 PHP 人不懂编程:请查看:http://bugs.php.net/bug.php?id=48507

【问题讨论】:

  • 在我看来,如果性能不是关键点,请使用 XML 序列化
  • 如果你在看 sqlite,去使用它。它的快速 n 灯适合你的情况。它也可以用作数据库 :)
  • 如果您遇到与\r 相关的问题,请查看auto_detect_line_endings setting
  • 你永远不会得到正确的答案,伙计。只是因为你没有提出正确的问题。没有数据示例,没有数据大小,没有背景,没有上下文——什么都没有。你只会得到空洞的答案,就像你的问题一样。
  • 如果您可以解决问题,听起来 CSV 是一个不错的选择。您能否提供更多关于您在编码中遇到了什么样的问题的信息?我使用不同的字符集/编码进行了很多工作,来自冰岛等等,这可能很麻烦,但没有什么是无法解决的。你的编码到底有什么问题?

标签: php sqlite serialization storage


【解决方案1】:

也许您的一种可能性是将您的数据缓存为真正的 PHP。函数var_export 为您提供数据的PHP 表示。它有一些限制,serialize 在循环引用方面没有,但另一方面它更容易理解,因为你已经知道语法。

【讨论】:

  • 有var_import()函数吗?
  • sims,你不需要一个,因为 var_export 的结果是有效的 PHP 代码。您可以简单地包含该文件。
【解决方案2】:

json_encode()json_decode() 可能对你有好处? Sqlite 对多维数组不是很好的解决方案。

【讨论】:

  • 您不会将数组直接存储到任何东西中。如果编码成 JSON,存储在哪里?
【解决方案3】:

您是否考虑过使用 YAML,

你可以找到 YAML 网站 here 并且你可以找到一个小库来处理 YAML here

【讨论】:

  • 他不想要依赖。另请参阅:stackoverflow.com/questions/4888449/… 再次使用 YAML 有什么意义?
  • 不,他不想安装软件(扩展),因此应用程序很容易从服务器复制到服务器,我已将其链接到他可以驻留在他的应用程序中的库。 YAML 可以很好地解决这个问题,尽管 serialize 和 json_encode 是更好的解决方案。
【解决方案4】:

是的,您需要对其进行序列化。然后你可以将它存储在任何你喜欢的地方。 SQLite、MySQL、PGSQL、平面文件等。既然你是序列化它,应该不会有语言环境的问题。

[编辑]

当然,您应该序列化您尝试存储的 PHP 对象。并且您不应该直接通过存储介质对其进行编辑。你应该反序列化它并通过 PHP 操作它。

[编辑]

既然你说你不想使用数据库服务器,你必须使用平面文件。

我会使用 SQLite。如果您不想这样做,则需要创建自己的文件解析器。您可以为每个文件存储一个对象并通过文件名识别对象。

不过,您必须考虑用户空间。如果这是一个问题,您可以使用会话。这对于缓存数据很常见。

重申一下,您需要在使用任何存储方法之前对数据进行序列化。它不是序列化与 SQLite 的对比。它是序列化 + SQLite。您需要对其进行序列化,然后将其插入 SQLite db 或序列化数据,然后将其存储在会话中。

缓存数据并不是什么新鲜事。你没有开辟新天地。之前已经做过很多次了。

【讨论】:

  • 在举报的时候不要告诉发帖人他不应该有问题。此外,发帖人还想知道序列化数组和将数组值存储在数据库中的区别。
  • 也许您在阅读或理解问题时遇到了问题。他试图将数组存储在 CSV 文件中。他说它确实适用于序列化,但很难编辑。当然,您应该序列化您尝试存储的任何 PHP 对象。并且您不应该直接通过存储介质对其进行编辑。您应该反序列化它并通过 PHP 操作它。我认为这很明显。我猜不是,因为你也不明白。
【解决方案5】:

如果您打算将数组用作列表、集合或哈希,请查看键值存储 redis

它速度极快,专为这种用途而设计,并且有很多 PHP 绑定。

【讨论】:

  • 他不想要依赖。
【解决方案6】:

你的意思是类似于 do_put() 方法here?只需注意“缓存内容”部分...输出缓存文件如下所示:

<?php
$value = <<<FILEINFO_26
a:13:{s:4:"f_id";i:26;s:6:"f_hash";s:32:"d07288e848cc6219b7a793b0532f8fed";s:11:"f_extension";s:3:"jpg";s:6:"f_name";s:7:"214.jpg";s:6:"f_size";i:12902;s:10:"f_duration";N;s:6:"f_mime";s:10:"image/jpeg";s:11:"f_os_compat";N;s:9:"f_version";s:4:"NULL";s:14:"f_architecture";s:2:"32";s:7:"f_extra";N;s:11:"f_timestamp";i:1276516112;s:12:"f_dimensions";a:2:{s:5:"width";s:3:"180";s:6:"height";s:3:"227";}}
FILEINFO_26;

$is_array = 1;    

$ttl = 0; 
?> 

它使用serialize(),还可以将缓存存储在Db中...来源here

【讨论】:

  • ADDENDUM:我这样回答是因为提问者的第一句话是“我想将数组存储在文件中。”,所以你去......将它存储在任何地方,文件,Db,memcached。
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多