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

Kea*_*her 4 php fopen fwrite

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

不幸的是,我不确定"太大"究竟有多大.我想它可能已经大约4GB.

为了解决这个问题,我把文件echo给了stdout.当我这样调用程序时,我重定向了它:

[root@localhost]$ php generatesql.php > myfile.sql
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*xon 6

可能发生的是底层PHP构建是32位,无法处理> 4GB的文件指针 - 请参阅此相关问题.

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

顺便说一句,SQL文件很可能是高度可压缩的,因此您可能会考虑使用gzip fopen包装器在编写文件时压缩文件.

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

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

fclose($f);
Run Code Online (Sandbox Code Playgroud)

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

zcat /path/to/my/file.sql.gz | mysql mydatabase
Run Code Online (Sandbox Code Playgroud)