【问题标题】:File writing out of order in PHPPHP中的文件写入乱序
【发布时间】:2015-07-25 03:29:16
【问题描述】:

这是我的问题的一个超级简单的例子。该代码预计将分别创建 1000 个名为 file1 到 file1000 的文件,并且在每个文件中,数字 1 到 1000000000 应该以升序出现,每行一个数字,因为一个人浏览文件。

<?php 
for ($filenum=1;$filenum<=1000;$filenum++){
    $handle=fopen("file".$filenum,"w");
    for ($num=1;$num<=1000000000;$num++){
        fwrite($handle,$num."\n");
    }
    fclose($handle);
}
?>

在执行时,第一个文件 file0001 被正确创建。然而,第二个文件包含乱序的数字。我相信这是因为 fwrite 将字符串发送到稍后写入的特殊缓冲区中?

我想要的是立即写入数据。我不在乎是否需要额外的十分钟才能正确写入文件,我愿意使用更好的函数来代替 fopen() fwrite() 和 fclose()。我相信在 C 语言中,有一个名为 OPEN 的系统函数用于创建没有任何缓冲的文件,而这正是我想要的。

谁能告诉我应该使用更好的功能吗?还是我必须求助于创建自己的涉及循环的函数,直到 fwrite() 函数写入所有数据并祈祷系统不会锁定?

【问题讨论】:

  • 我运行了一个测试,只创建了 10 个文件,10k 行,按预期工作。无法想象这个在现实世界中的用途 :-)
  • 我尝试了循环方法并写入了一些字节,但是在fwrite无限期返回零值之后,文件句柄仍然有效。
  • 您可能正在寻找stream_set_write_bufferfile_put_contentstouch 可以创建更简单的文件。否则请调查flock,如果原因实际上是并发访问或其他原因。

标签: php c file buffer fwrite


【解决方案1】:

如果您不想缓冲,请在每次使用 fwrite 时使用fflushhttp://php.net/manual/en/function.fflush.php

但是fwrite 函数应该适用于您的用例,即使它缓冲数据。缓冲区是有序的。

我建议你检查函数的返回值。检查它是否有与 IO 相关的功能始终是一个好习惯。如果不成功,fwrite 函数将返回 false。下面的文档详细解释了其他情况。示例情况是当您的文件系统已满时。

http://php.net/manual/en/function.fwrite.php

根据本页的评论,fwrite 在失败时也会返回零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多