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

标签 php fopen fwrite

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

不幸的是,我不确定到底有多大才算“太大”。我认为它可能在 4GB 左右。

为了解决这个问题,我将文件 echo 输出到标准输出。当我这样调用程序时,我重定向了它:

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

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

那么,我的问题是:fopen()fwrite() 在生成文件的能力方面是否受到文件系统的限制?如果是这样;这是PHP的限制吗?其他语言也会出现这种情况吗?

最佳答案

可能发生的情况是底层 PHP 构建是 32 位的,无法处理 >4GB 的文件指针 - 参见 related question .

您的底层操作系统显然能够存储大文件,这就是您能够将标准输出重定向到大文件的原因。

顺便说一句,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

关于php - fopen() 是否受文件系统限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229534/

相关文章:

php - 从 JSON 数据自动生成 MySQL 表和列

php - fatal error : Call to undefined function xcache_isset()

PHP获取memcached的所有key总是返回false

c - 在c中写入或读取二进制文件的概率

c - fclose() 之后 fwrite() 成功

php - PHP 中的 substr_replace 编码

php - 使用 redis 驱动程序时如何更改 Laravel 4 的连接信息?

c - 用C读取带有空格的文件.txt

c++ - 如何在子目录中创建文本文件?

c - 如果不运行在 Debug模式下,c 中的 fopen 将无法工作