2009-11-20 52 views
1

数据:$data = array('Alice', 'Bob', 'Carol', 'David', 'Elizabeth', 'Frank');如何写一个一维数组到一个文件在PHP又名file_put_contents VS的fopen + fwrite的


方法A:

file_put_contents('filename.ext', implode("\n", $data));

方法2:

 
$fp = fopen('filename.ext', 'w'); 
foreach($data as $name) 
{ 
    fwrite($fp, $name . "\n"); 
} 
fclose($fp); 

一种方法是否对另一种方法有任何重大处罚?

任何速度都明显更快,即使是在成本上?免费?

首选项?它是情景吗? 你将在生产代码中使用哪一种与1次使用的一次性脚本?

注意:请忽略检查文件名是否可写,或filepointer为!false的任何问题。假定0摩擦,并且一切都“正常”。

+0

“你会在使用中......一次性使用一次性脚本?“ file_get_contents,总是 - 它不那么冗长。我总是在最细节的选项方面犯错,只有在重要时才进行优化。 – 2009-11-20 03:04:47

回答

6

使用serialize(),而不是一个半生不熟的模仿:

file_put_contents('filename.ext', serialize($data)); 

,除非您需要的文件是人类可读和/或可编辑无论出于何种原因,在这种情况下,你需要仔细考虑哪些数据”坚持文件,以便您可以想出一个强大的存储方法。

至于file_put_contents() vs你的循环,只是做file_put_contents(),除非你不能。它代码更少,阅读起来更容易。我怀疑与实现有什么实质性差异,即使它们是,写入文件到磁盘的性能因写入到磁盘的事实而变得相形见绌。不要为小(不相关)的东西出汗。

+0

实际上,在大多数情况下,我确实需要用纯文本“每行1项”文件,因为它们是其他脚本的工作队列,但需要进行人工删除/编辑以删除几行文件。 脚本到脚本我使用序列化,没有问的问题,在这种情况下,我使用f_p_c,因为无法得到serialize()的结果,除非作为1个巨大的字符串反正。 – Uberfuzzy 2009-11-20 10:44:29

3

从文档为file_put_contents

此功能是相同的调用fopen()函数,的fwrite()和FCLOSE()依次将数据写入到文件中。

看起来,构建字符串并将其“立刻写入”将在I/O方面更高效。这样做可以使数据以大块写入,而不是以较小的位写入。在考虑I/O性能时,这通常是首选。

+0

它会改变你的陈述,如果数据数组不是6项,但60000?这意味着除了已经拥有的非常大的数组之外,还会建立(通过implode)并暂时缓冲内存中的一个非常大的字符串,这意味着,在短时间内,您需要在ram中拥有2个副本。 – Uberfuzzy 2009-11-20 10:37:25

0

file_put_contents()获胜。 fopen/write/close是无缘无故冗长的。如Cletus所说,只需使用serialize()序列化数据即可。

除非你正在处理多字节字符,它有时会中断序列化(但如果需要的话,你可以在线找到mb_serialize()的各种用户级实现)。

我不确定性能的影响,但您可能更喜欢将数组存储为json序列化的字符串(json_encode())。这样,如果其他系统需要读取文件,则将使用标准序列化格式,而不是特定于PHP的文件。我严肃地怀疑这种或那种方式有任何真正的性能差异。

+0

希望我可以从序列化切换到json_serialize,但它不是我的代码,并且它的很多部分都与其他外部事物的遗留关系,我不能改变:( – Uberfuzzy 2009-11-20 10:47:03

0

在写这篇文章的时候,这个问题是很老,反正..如果我理解得很好,比所有需要的是var_export($variable, true)file_put_contents()

例子:

<?php 

$filePathName = '/directory/file.php'; 

$array = array(
    0 => 'value', 
    'key' => 
    array(
     'Yes' => true, 
     'No' => false, 
     'Whatever' => 'string', 
    ), 
); 

file_put_contents($filePathName, 
    '<?php $array = '.var_export($array, true).";\n", 
LOCK_EX); 
相关问题