2011-01-06 134 views
8

Estoy intentando subir un archivo de más de 2 GB a un servidor PHP 5.3.4 local. He establecido las siguientes variables de servidor:Carga de un archivo de más de 2GB usando PHP

memory_limit = -1 
post_max_size = 9G 
upload_max_filesize = 5G 

Sin embargo, en el error_log que encontré:

PHP Advertencia: Enviar Content-Length de 2120909412 bytes supera el límite de 1073741824 bytes en Unknown on line 0

¿Alguien puede decirme por qué esto sigue fallando por favor?

+3

HTTP realmente no es la elección correcta de protocolo para cargar un archivo de 2GB. Deberías usar (S) FTP para esto. –

+3

¿Ha verificado que esas son las variables en uso? (es decir, a través de 'phpinfo()') PHP nunca deja de sorprenderme acerca de qué archivo de configuración está leyendo en realidad ... (Además, HTTP no está destinado para esto ...) – Thanatos

+1

¿Por qué quieres usar PHP para esto? en lugar de algo como FTP o cualquier número u otras formas de cargar archivos – Earlz

Respuesta

2

Tal vez esto puede provenir de limitaciones en el tamaño de apache POST:

http://httpd.apache.org/docs/current/mod/core.html#limitrequestbody

parece que esta limitación de 2 GB puede ser mayor en 64bits instalaciones, tal vez. Y no estoy seguro de que configurar 0 en este directoriove no alcance el límite de compilación. Para ejemplos ver ese hilo:

http://ubuntuforums.org/archive/index.php/t-1385890.html

Entonces no olvide de alterar así la max_input_time en PHP.

Pero está llegando a límites altos :-) tal vez podría probar un cliente rico (¿flash? Js?) En el lado del navegador, haciendo la transferencia en trozos o algún tipo de cosas de FTP, con indicadores de progreso para el usuario.

+0

Intenté la misma operación en un sistema operativo de 64 bits y no tuve problemas en absoluto. Gracias por tu ayuda. – Reado

3

No lo sé en 5.3.x, pero en 5.2.x hay algunos problemas int/long en el código PHP. incluso si está en un sistema de 64 bits y tiene una versión de PHP compilada con 64 bits, existen varios problemas.

En primer lugar, el código que convierte post_max_size y otros de ascii a entero almacena el valor en un int, por lo que convertir "9G" y poner el resultado en este int bork el valor porque 9G es un número mayor que un 32 -bit variable puede contener.

Pero también hay varias otras áreas de código PHP que se usan con el módulo Apache, CGI, etc. que deben cambiarse de int a long.

Entonces ... para que esto funcione, debe editar el código PHP y compilarlo a mano (asegúrese de compilarlo como de 64 bits). Aquí hay un enlace a un listado de diferencias:

http://www.archive.org/~tracey/downloads/patches/karmic-64bit-post-large-files.patch

Referencia de este error php mensaje: http://bugs.php.net/bug.php?id=44522

El archivo anterior es un diff en 5.2.10 código, pero acabo de hacer los cambios manualmente al código 5.2.17 y acabo de cargar un archivo único de 3.4 gb a través de apache/php (que no había funcionado antes del cambio).

ope que ayuda.

3

tuve un problema similar, pero mi config fue:

post_max_size = 1.8G 
upload_max_filesize = 1.8G 

y sin embargo no podía cargar un archivo de 1,2 GB.El error era muy mismo:

PHP Warning: POST Content-Length of 1347484420 bytes exceeds the limit of 1073741824 bytes in Unknown on line 0 

pasé un día preguntándose dónde diablos era este "límite de 1073741824" procedente de!

Solución:

En realidad, el error estaba en el analizador php.ini: Sólo se entiende números enteros, por lo que en esencia se analizaba como 1.8G1G !!

Cambiando el valor a p. 1800M lo arregló.

PLS se aseguran que reiniciar el servidor Apache con el siguiente comando servicio apache2 restart

+0

Llevo horas tratando de descubrir cuál podría ser el problema con una instalación de owncloud para subir archivos grandes, y este era el problema después de todo. – Ark74

1

Como se mencionó phliKtid, esto es una limitación con el marco de PHP. Guárdelo para editar el código fuente como se menciona en el bug report phliKtid linked, hay una solución que implica establecer el upload_max_filesize en 0 en el archivo php.ini.

; Maximum allowed size for uploaded files. 
; http://php.net/upload-max-filesize 
upload_max_filesize = 0 

Al hacer esto, PHP no se bloqueará al intentar convertir "5G" en un entero de 32 bits y usted será capaz de subir archivos tan grandes como usted permite que con el "post_max_size" variable.

1

que encontrar la manera de utilizar HTTP y PHP para subir una 10G archivo.

php.ini:

post_max_size = 0 
upload_max_filesize = 0 

Funciona en php 5.3.10.

si no carga todo ese archivo en la memoria, memory_limit no está relacionado.

Cuestiones relacionadas