Se fopen () limitado por el sistema de archivos?
Pregunta
Me escribió un programa para generar grandes archivos .SQL para poblar rápidamente grandes bases de datos. Yo con guión en PHP. Cuando empecé codificación que estaba usando fopen () y fwrite () . Cuando los archivos se ponían demasiado grande el programa devuelve el control a la cáscara y el archivo no estaría completo.
Por desgracia no estoy seguro exactamente qué tan grande es 'demasiado grande'. Creo que puede haber sido de alrededor de 4 GB.
Para resolver este problema que tenía el archivo echo en la salida estándar. Me redirigí que cuando me llamó el programa de este modo:
[root@localhost]$ php generatesql.php > myfile.sql
Lo que funcionó de maravilla. Mi archivo de salida terminó siendo alrededor de 10 GB.
Mi pregunta, entonces, es: ¿ fopen () y fwrite () limitado por el sistema de archivos en términos de cómo archivo de una gran son capaces de generar? Si es así; se trata de una limitación de PHP? ¿Esto sucede en otros idiomas así?
Solución
Lo que está ocurriendo, probablemente, es la instalación de PHP subyacente es de 32 bits y no puede manejar apuntadores de archivo> 4 GB - ver esta relacionado pregunta .
Su sistema operativo subyacente es, obviamente, capaz de almacenar archivos de gran tamaño, que usted es capaz de redirigir la salida estándar a un archivo de gran tamaño.
¿Por quéA propósito, un archivo SQL es probable que sea altamente compresible, por lo que le gustaría considerar el uso de la gzip fopen envoltorio para comprimir el archivo mientras lo escribes.
$file = 'compress.zlib:///path/to/my/file.sql.gz';
$f = fopen($file, 'wb');
//just write as normal...
fwrite($f, 'CREATE TABLE foo (....)');
fclose($f);
Su volcado será una fracción del tamaño original, y se puede restaurar simplemente tubería de la salida de zcat en un cliente de SQL, por ejemplo, para MySQL
zcat /path/to/my/file.sql.gz | mysql mydatabase
Otros consejos
Sí y no. No es fopen () o fwrite () que se limitan directamente, sus archivos, los cuales no podrán exceder algunas dimensiones en función del sistema de archivos. Echar un vistazo a Comparación de los sistemas de archivos en la Wikipedia.
¿Es posible que el script está tomando demasiado tiempo para ejecutar y ha agotado el tiempo?
Como alternativa, es posible que usted está alcanzando sus límites de memoria dentro de la escritura?
Puede escribir más de 2 GB de datos en un corriente , no en un archivo (como el puntero interno fseek del archivo está excediendo los límites de PHP, y las corrientes son por lo general no seekable)
<?
$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);