【问题标题】:Php using unserialize() and serialize() changing values in a saved filephp 使用 unserialize() 和 serialize() 更改保存文件中的值
【发布时间】:2010-04-21 20:06:21
【问题描述】:

我有一个序列化的值数组保存到文件中,需要更改其中一个变量的值。在示例中,我更改了 $two 的值,然后使用新值将整个数组保存回文件中。

有没有更有效的方法来改变单个值而不必读取和写入整个文件/数组。

$data = file_get_contents('./userInfo');

$data = unserialize($data);
extract($data);
$two="this is a altered value";

 $userData = array(
        'one'          => $one,
        'two'          => $two,
        'three'        => $three
        );

 $file=fopen("../userInfo",'w');
        fwrite($file, $userData);
 fclose($file);

【问题讨论】:

标签: php serialization


【解决方案1】:

您不需要像那样使用extract()rebuild $userData - 只需访问您需要的数组键。此外,您可以使用file_put_contents() 来节省一些步骤

此函数与调用相同 fopen()、fwrite() 和 fclose() 依次将数据写入文件。

新代码:

$filePath = './userInfo';

$data = unserialize( file_get_contents( $filePath ) );

$data['two'] = "this is a altered value";

file_put_contents( $filePath, serialize( $data ) );

【讨论】:

  • 我回头看了看,它确实使我的代码更容易阅读,这总是好的,但它与我的问题中的代码相同。
  • 取决于您如何定义“相同”。我向您展示了如何更轻松地修改单个值。您还在寻找什么?
  • "好的" 它比我编写的代码更有效率,但你仍然要读写整个数组。我想要一种方法来最小化完成给定任务所需的读写量。我本来可以更清楚的。
  • 首先,这几乎不是“低效”的,因为它在每次操作时读取/写入整个文件。但无论如何,PHP 必须先将文件读入内存,然后才能对其进行修改。虽然一次只能将文件的 部分 读入内存是可能的,但这些选项是有限的。例如,您可以通过一次读取一行文件来提高内存效率,但在这种情况下这是没有意义的,因为序列化的数组无论如何都会出现在一行上。您也可以一次读取 N 个字节,但也没有实际意义,因为您不知道要更新的数据的字节位置。
  • drawnonward 通过使用固定块大小准确地建议了最后一个选项。不要误会我的意思,我确实听取了您的建议并根据您的建议更改了部分代码,我很感激。我开出支票是因为他有点看透了我的想法。
【解决方案2】:

选项 1:每个数组条目的数据库行。

选项 2:每个数组条目的不同文件,使用文件名而不是数组键。基本上使用文件系统中的一个目录作为一个非常简单的数据库。

选项 3:平面文件中固定大小的条目,因此您可以将数组索引乘以块大小进行读写。您必须截断大于您选择的块大小的数据。基本上将单个文件用作一个非常简单的数据库。

【讨论】:

  • 选项 1 已退出。这是我尝试不使用数据库的尝试,有时会过度杀戮。选项 2 是一个不错的主意,但可能会变得混乱。选项 3 实际上是一个有趣的想法,我可能不得不尝试这种方式。
【解决方案3】:

如果您愿意进行手动字符串解析,那么您只需重写该值之后出现的文件内容的其余部分,假设您更改了字符串的长度。如果不更改字符串的长度,则可以就地编辑。除非这个序列化数据文件非常很大,否则我真的怀疑你会做任何事情,只是让它变慢。

不过我不会打扰。如果这会给您带来性能问题,我会认真考虑使用不同的存储格式。

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多