fopen()是否受文件系统的限制?

时间:2010-11-19 21:28:38

标签: php fopen fwrite

我编写了一个程序来生成大型.SQL文件,以便快速填充非常大的数据库。我用PHP编写脚本。当我开始编码时,我使用 fopen() fwrite()。当文件太大时,程序会将控制权返回给shell,文件将不完整。

不幸的是,我不确定“太大”究竟有多大。我认为它可能大约是4GB。

为了解决这个问题,我将文件 echo 添加到stdout。当我像这样调用程序时,我重定向了它:

[root@localhost]$ php generatesql.php > myfile.sql

这就像一个魅力。我的输出文件最终大约是10GB。

我的问题是: fopen() fwrite()受文件系统限制,它们能够生成多大的文件?如果是这样;这是PHP的限制吗?这种情况是否也会发生在其他语言中?

4 个答案:

答案 0 :(得分:6)

可能发生的是底层PHP构建是32位且无法处理文件指针> 4GB - 请参阅此related question

您的底层操作系统显然能够存储大文件,这就是为什么您能够将stdout重定向到大文件的原因。

顺便说一句,SQL文件可能具有高度可压缩性,因此您可能需要考虑使用gzip fopen wrapper在编写文件时压缩文件。

$file = 'compress.zlib:///path/to/my/file.sql.gz';
$f = fopen($file, 'wb');

    //just write as normal...
    fwrite($f, 'CREATE TABLE foo (....)');

fclose($f);

您的转储将是原始大小的一小部分,您可以将其简单地从zcat输出到SQL客户端,例如,对于mysql

zcat /path/to/my/file.sql.gz | mysql mydatabase

答案 1 :(得分:2)

是和否。它不是直接限制的 fopen() fwrite(),它的文件根据文件系统不能超过某些维度。请查看维基百科上的Comparison of filesystems

答案 2 :(得分:0)

你的脚本执行时间太长可能会超时吗?

或者,您是否有可能在脚本中达到内存限制?

答案 3 :(得分:0)

您可以在中写入超过2GB的数据,而不是在文件中(因为文件的fseek内部指针超出了PHP限制,并且流是通常不可寻求)

<? $target = fopen('test.tar', 'w'); //this is a file, limited by php to 2GB $body = str_repeat("===", 1024 * 1024); while(true) fwrite($target, $test);

<? $target = popen('cat > test.tar', 'w'); //this is a stream, no limitation here $body = str_repeat("===", 1024 * 1024); while(true) fwrite($target, $test);