【问题标题】:PHP fopen() memory efficiency and usagePHP fopen() 内存效率和使用情况
【发布时间】:2012-09-20 18:23:59
【问题描述】:

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

如果我使用

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

在我调用之前存储的 $handle 在哪里

fclose($handle);

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

其次,我正在使用一个循环构建文件,该循环一次需要 1024 个字节的数据,并且每次将数据写入为:

fwrite($handle, $content);

然后调用

fclose($handle);

当循环完成并写入所有数据时。但是,使用这样的循环会更有效还是更利于内存

$handle = fopen($file, 'a');
fwrite($handle, $content);
fclose($handle);

?

【问题讨论】:

    标签: php memory fopen


    【解决方案1】:

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

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

    您当前的方法是两种选择中更有效的一种。一次又一次地打开、写入和关闭同一个文件的效率低于只打开一次、多次写入然后关闭它的效率。打开和关闭文件需要设置输入和输出缓冲区以及分配其他内部资源,这些操作是相对昂贵的。

    【讨论】:

    • 有趣的是,自从您写下您的答案以来,汽车制造商开始在每次停车时关闭发动机,因为这确实提高了效率。
    • 是的,这不是很好。
    【解决方案2】:
    1. 根据PHP DOCS fopen() 创建一个File handle 流。它与文件系统中的文件相关联。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多