Foros del Web » Programando para Internet » PHP »

Out of memory en upload

Estas en el tema de Out of memory en upload en el foro de PHP en Foros del Web. Tengo un upload en mi página web para subir algunos archivos pesados que necesito. El problema es que cuando pesa mucho y está bastante rato ...
  #1 (permalink)  
Antiguo 20/03/2012, 02:22
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 11 meses
Puntos: 9
Out of memory en upload

Tengo un upload en mi página web para subir algunos archivos pesados que necesito. El problema es que cuando pesa mucho y está bastante rato para subirse cuando va mas o menos por el 70 por ciento me tira:

PHP Fatal error: Out of memory (allocated 553648128) (tried to allocate 553124001 bytes) in Unknown on line 0

Ya le dí una burrada de memoria y sigue tirándome eso, cada vez que le doy más aguanta mas tiempo pero hay un limite..

¿Alguna solución o porque ocurre esto?
  #2 (permalink)  
Antiguo 20/03/2012, 07:36
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Out of memory en upload

El problema te lo indica, necesitas aumentar la memoria en que puede correr el código, si no te seguirá dando ese error.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 20/03/2012, 08:32
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 11 meses
Puntos: 9
Respuesta: Out of memory en upload

ya le dí muchisimo, he llegado a darle 100.000 y nada
  #4 (permalink)  
Antiguo 20/03/2012, 10:41
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 7 meses
Puntos: 528
Respuesta: Out of memory en upload

¿Y qué tal si los subes co una conexión ftp? Yo alguna vez hice una aplicación de este tipo y soportaba subir archivos de cientos de megas, además de ser un poco más fiable que por http
  #5 (permalink)  
Antiguo 20/03/2012, 11:42
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 11 meses
Puntos: 9
Respuesta: Out of memory en upload

Lo necesito por http, no sé porque hay páginas que pueden y yo no -.-"

PHP Fatal error: Out of memory (allocated 542375936) (tried to allocate 541852001 bytes) in Unknown on line 0
  #6 (permalink)  
Antiguo 20/03/2012, 11:44
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 7 meses
Puntos: 528
Respuesta: Out of memory en upload

Y cómo es el código de tu subida? quizá ahí radique el problema.
  #7 (permalink)  
Antiguo 20/03/2012, 11:46
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Out of memory en upload

Que tal SeaPirates,

Que directivas modificaste ? y donde sucede ? en local o en producción ?, si es produccion comprueba que efectivamente se estan seteando los valores.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #8 (permalink)  
Antiguo 20/03/2012, 11:52
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 11 meses
Puntos: 9
Respuesta: Out of memory en upload

Cita:
Iniciado por ocp001a Ver Mensaje
Y cómo es el código de tu subida? quizá ahí radique el problema.

He cambiado ya muchas opciones de configuración sin exito, para subir 700mb al 74% vuelve a empezar:

Cita:
default_socket_timeout = 1000000
max_input_time = 1000000
memory_limit = 280000
post_max_size = 1000000
upload_Max_filesize = 1000000
max_execution_time = 1000000
Realmente creo que es el código php, pero no encuentro ningún modo de mejorarlo, es un upload desde ajax:

Código PHP:
Ver original
  1. <?php
  2.  
  3. require_once ("includes/core.php");
  4.  
  5. $fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);
  6.  
  7. if ($fn)
  8. {
  9.  
  10.  
  11.     $ftmp = explode(".", $_SERVER['HTTP_X_FILENAME']);
  12.     $extensiones = mysql_num_rows(mysql_query("SELECT id FROM formats WHERE format = '$ftmp[1]'"));
  13.     $fExt = strtolower($ftmp[count($ftmp) - 1]);
  14.  
  15.     if ($extensiones == "0")
  16.     {
  17.         echo "error";
  18.     }
  19.     else
  20.     {
  21.         // AJAX call
  22.         $folder_1 = substr(sha1(uniqid(rand())), 0, 40);
  23.         $folder_2 = substr(sha1(uniqid(rand())), 0, 40);
  24.         $filename = substr(sha1(uniqid(rand())), 0, 40);
  25.         mkdir("files/" . $folder_1 . "", 0777, true);
  26.         mkdir("files/" . $folder_1 . "/" . $folder_2 . "", 0777, true);
  27.         chmod("files/" . $folder_1 . "", 0777);
  28.         chmod("files/" . $folder_1 . "/" . $folder_2 . "", 0777);
  29.  
  30.         file_put_contents("files/" . $folder_1 . "/" . $folder_2 . "/" . $fn,
  31.             file_get_contents('php://input'));
  32.         rename("files/" . $folder_1 . "/" . $folder_2 . "/" . $_SERVER['HTTP_X_FILENAME'],
  33.             "files/" . $folder_1 . "/" . $folder_2 . "/" . $filename . "." . $fExt . "");
  34.         $refer_1 = rand(1111111111, 9999999999);
  35.         $refer_2 = rand(1111111111, 9999999999);
  36.         $refer = substr(sha1(uniqid(rand())), 0, 10);
  37.         $download_1 = rand(1111111111, 9999999999);
  38.         $download_2 = rand(1111111111, 9999999999);
  39.         $download = substr(sha1(uniqid(rand())), 0, 40);
  40.         $direct = "files/" . $folder_1 . "/" . $folder_2 . "/" . $filename . "." . $fExt .
  41.             "";
  42.         if (isset($_SESSION['id']))
  43.         {
  44.             $type = "user";
  45.             $owner = $user['username'];
  46.         }
  47.         else
  48.         {
  49.             $type = "guest";
  50.             $owner = $_SERVER['REMOTE_ADDR'];
  51.         }
  52.         mysql_query("INSERT INTO downloads (refer_id,download_id,direct_download,filename,type,owner,lastdownload) VALUES('" .
  53.             $refer . "','" . $download . "','" . $direct . "','" . $_SERVER['HTTP_X_FILENAME'] .
  54.             "','$type','$owner','" . time() . "')");
  55.         $peso_archivo = filesize($direct);
  56.         if (!isset($_SESSION['upstyle']))
  57.         {
  58.             $class = "odd";
  59.             $_SESSION['upstyle'] = true;
  60.         } elseif ($_SESSION['upstyle'])
  61.         {
  62.             $class = "even";
  63.             unset($_SESSION['upstyle']);
  64.         }
  65.  
  66.  
  67.         echo '<section class="file ' . $class . '"><section class="FileSep">' . $_SERVER['HTTP_X_FILENAME'] .
  68.             '</section> <section class="FileSep">' . file_size($peso_archivo) .
  69.             '</section> <section class="FileSep" style="width:500px;"><a class="link" href="https://' .
  70.             $_SERVER['SERVER_NAME'] . '/d' . $refer .
  71.             '" target="_blank" id="tooltip_left">https://' . $_SERVER['SERVER_NAME'] . '/d' .
  72.             $refer . '<section>Con este enlace podr&aacute;s descargar tu archivo o pasarlo a tus amigos cuando quieras</section></a></section> <section class="FileSep"><a id="tooltip_left" class="tag" href="#" id="tooltip_left">Eliminar<section>Para eliminar esta descarga haz click a este enlace</section></a> <a id="tooltip_left" class="tag" href="#" id="tooltip_left">Compartir<section>Proximamente</section></a></section></section>';
  73.  
  74.     }
  75. }
  76.  
  77. ?>

Última edición por SeaPirates; 20/03/2012 a las 11:58
  #9 (permalink)  
Antiguo 20/03/2012, 12:07
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 7 meses
Puntos: 528
Respuesta: Out of memory en upload

¿Dejaste upload_Max_filesize = 1000000 así tal cual? de ser así esa medida es e byte, no en megabytes: http://php.net/manual/es/ini.core.php
  #10 (permalink)  
Antiguo 20/03/2012, 12:35
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 11 meses
Puntos: 9
Respuesta: Out of memory en upload

Cita:
Iniciado por ocp001a Ver Mensaje
¿Dejaste upload_Max_filesize = 1000000 así tal cual? de ser así esa medida es e byte, no en megabytes: http://php.net/manual/es/ini.core.php

Se me olvidó la M, pero ya estaba puesta
  #11 (permalink)  
Antiguo 21/03/2012, 04:08
 
Fecha de Ingreso: enero-2009
Ubicación: España
Mensajes: 786
Antigüedad: 15 años, 11 meses
Puntos: 9
Upload de archivos con php

Intengo crear un upload de archivos pesados con php y ajax, pero creo que con la función copy() consume mucha memoria y me da out of memory (Aunque ya le he dado muchísima memoria)

Código PHP:
Ver original
  1. require_once ("includes/core.php");
  2.  
  3. $fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);
  4.  
  5. if ($fn) {
  6.  
  7.  
  8.     $ftmp = explode(".", $_SERVER['HTTP_X_FILENAME']);
  9.     $extensiones = mysql_num_rows(mysql_query("SELECT id FROM formats WHERE format = '$ftmp[1]'"));
  10.     $fExt = strtolower($ftmp[count($ftmp) - 1]);
  11.  
  12.     if ($extensiones == "0") {
  13.         echo "error";
  14.     } else {
  15.         // AJAX call
  16.         $folder_1 = substr(sha1(uniqid(rand())),0,40);
  17.         $folder_2 = substr(sha1(uniqid(rand())),0,40);
  18.         $filename = substr(sha1(uniqid(rand())),0,40);
  19.         mkdir("files/" . $folder_1 . "", 0777, true);
  20.         mkdir("files/" . $folder_1 . "/" . $folder_2 . "", 0777, true);
  21.         chmod("files/" . $folder_1 . "", 0777);
  22.         chmod("files/" . $folder_1 . "/" . $folder_2 . "", 0777);
  23.  
  24.         file_put_contents("files/" . $folder_1 . "/" . $folder_2 . "/" . $fn,
  25.             file_get_contents('php://input'));
  26.         rename("files/" . $folder_1 . "/" . $folder_2 . "/" . $_SERVER['HTTP_X_FILENAME'],
  27.             "files/" . $folder_1 . "/" . $folder_2 . "/" . $filename . "." . $fExt . "");
  28.  
  29.         $refer = substr(sha1(uniqid(rand())),0,10);
  30.    
  31.         $download = substr(sha1(uniqid(rand())),0,40);
  32.         $direct = "files/" . $folder_1 . "/" . $folder_2 . "/" . $filename . "." . $fExt .
  33.             "";
  34.         if (isset($_SESSION['id'])) {
  35.             $type = "user";
  36.             $owner = $user['username'];
  37.         } else {
  38.             $type = "guest";
  39.             $owner = $_SERVER['REMOTE_ADDR'];
  40.         }
  41.         mysql_query("INSERT INTO downloads (refer_id,download_id,direct_download,filename,type,owner,lastdownload) VALUES('" .
  42.             $refer . "','" . $download . "','" . $direct . "','" . $_SERVER['HTTP_X_FILENAME'] .
  43.             "','$type','$owner','" . time() . "')");
  44.         $peso_archivo = filesize($direct);
  45.         if (!isset($_SESSION['upstyle'])) {
  46.             $class = "odd";
  47.             $_SESSION['upstyle'] = true;
  48.         } elseif ($_SESSION['upstyle']) {
  49.             $class = "even";
  50.             unset($_SESSION['upstyle']);
  51.         }
  52.  
  53.  
  54.         echo '<section class="file ' . $class . '"><section class="FileSep">' . $_SERVER['HTTP_X_FILENAME'] .
  55.             '</section> <section class="FileSep">' . file_size($peso_archivo) .
  56.             '</section> <section class="FileSep" style="width:500px;"><a class="link" href="https://' .
  57.             $_SERVER['SERVER_NAME'] . '/d' . $refer .
  58.             '" target="_blank" id="tooltip_left">https://' . $_SERVER['SERVER_NAME'] . '/d' .
  59.             $refer . '<section>Con este enlace podr&aacute;s descargar tu archivo o pasarlo a tus amigos cuando quieras</section></a></section> <section class="FileSep"><a id="tooltip_left" class="tag" href="#" id="tooltip_left">Eliminar<section>Para eliminar esta descarga haz click a este enlace</section></a> <a id="tooltip_left" class="tag" href="#" id="tooltip_left">Compartir<section>Proximamente</section></a></section></section>';
  60.  
  61.     }
  62. }

¿Puede que sea por el file_put_contents, y en ese caso tenga que cambiar de código y función? ¿O si lo cambio seguirá pasándome?

Ya me estoy estresando, llevo semanas intentando solucionando cambiando configuraciones del servidor y nada.

Última edición por SeaPirates; 21/03/2012 a las 04:36
  #12 (permalink)  
Antiguo 21/03/2012, 06:52
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 17 años, 4 meses
Puntos: 194
Respuesta: Upload de archivos con php

muéstranos cuanta memoria le diste en el php.ini y de cuanto son tus archivos, solo por si acaso.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #13 (permalink)  
Antiguo 21/03/2012, 09:43
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 7 meses
Puntos: 528
Respuesta: Upload de archivos con php

Ya preguntaste en otro post lo mismo.

file_put_contents requiere colocar todo el contenido de un archivo en una variable.
por otra parte hay varias alternativas a copy, sobre todo tratándose de un archivo subido, como rename() o mejor move_uploaded_file()
  #14 (permalink)  
Antiguo 21/03/2012, 10:00
 
Fecha de Ingreso: diciembre-2005
Mensajes: 87
Antigüedad: 19 años
Puntos: 3
Respuesta: Upload de archivos con php

Yo te recomiendo utilizar move_uploaded_file()

Un Ejemplo:

Código PHP:
$TamPostUpload $tamano_archivo $TotalOcupado;

//Verifico Extenesiones y que el fichero no pese mas de 2 MB
        
if(!((strpos($tipo_archivo"gif") || strpos($tipo_archivo"jpeg") || strpos($tipo_archivo"png")) && ($tamano_archivo <= 2097152))) 
        {  
        echo 
"La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif - .jpg - .png<br><li>se permiten archivos de 2 MB máximo.</td></tr></table>";
        }
        elseif(
$TamPostUpload >= $MaxEspacioUsuario)
        {  
        
//se indica al usuario que no puede dar de alta el usuario porque ya existe ese login registrado.
        
echo "No dispone de espacio para subir mas fotografias";
        }
        else
        { 
            
if (
move_uploaded_file($HTTP_POST_FILES['fichero']['tmp_name'], $ruta $ID_Usuario "/" $seccion $nombre_archivo)){ 
       echo 
"El archivo ha sido cargado correctamente."

Etiquetas: memory, mysql, sql, upload
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:09.