PHP fopen()内存效率和用法

时间:2012-09-28 20:54:12

标签: php memory fopen

我正在构建一个系统来创建文件,范围从几Kb到大约50Mb,而这个问题更多是出于好奇而不是其他任何问题。我在网上找不到任何答案。

如果我使用

$handle=fopen($file,'w');

在我调用

之前存储的$句柄
fclose($handle);

?它存储在系统的内存中,还是存储在某个临时文件中?

其次,我使用一次占用1024字节数据的循环构建文件,每次都将数据写入:

fwrite($handle, $content);

然后调用

fclose($handle);

当循环完成并写入所有数据时。但是,使用

的循环会更有效还是内存友好
$handle = fopen($file, 'a');
fwrite($handle, $content);
fclose($handle);

3 个答案:

答案 0 :(得分:4)

在PHP术语中,fopen()(以及许多其他函数)返回resource。因此$handle是一个引用与您的$file相关联的文件句柄的资源。

Resources是内存中的对象,它们不会通过PHP持久保存到文件系统。

您目前的方法是两种方案中效率更高的方法。打开,写入,然后一遍又一遍地关闭同一个文件的效率低于仅打开一次,写入多次,然后关闭它。打开和关闭文件需要设置输入和输出缓冲区并分配其他内部资源,这是相对昂贵的操作。这是一个很糟糕的比喻,但这就像每次你停车时关掉汽车引擎一样。

答案 1 :(得分:1)

您的文件句柄只是另一个内存引用,并且像其他程序变量和资源一样存储在堆栈内存中。此外,在文件I / O方面,打开和关闭一次,并根据需要多次写入 - 这是最有效的方式。

$handle = fopen($file, 'a'); //open once
while(condition){
  fwrite($handle, $content); //write many
}
fclose($handle); //close once

答案 2 :(得分:0)

  1. 根据PHP DOCS,fopen()创建一个File handle的流。它与文件系统中的文件相关联。

  2. 每次需要编写另外1024个字节时创建新的File handle会非常慢。