Tema: FAQ's de PHP
Ver Mensaje Individual
  #138 (permalink)  
Antiguo 17/05/2005, 15:14
pentiumonce
 
Fecha de Ingreso: octubre-2004
Mensajes: 82
Antigüedad: 19 años, 6 meses
Puntos: 1
Subir archivos grandes a MySQL en Windows/Linux

Tema: Configuraciones para subir archivos binarios grandes a MySQL.

Pregunta: ¿ Como subir archivos grandes a MySQL en Windows/Linux ?

Respuesta:

Que tal un saludo, aqui les escribo estas consideraciones que se me presentaron cuando quise subir archivos mayores a 1MB a MySQL y la verdad es que si me costo un buen solucionarlo, es por eso que les dejo esto, a alguien le servira se los aseguro:

Aqui les pongo los sistemas y las versiones de APM en lo que lo hice:

Windows Xp Profesional/Fedora Core 1
Apache: 2.0.48
Php: 4.3.4
Mysql: 5.0.0

chequen tambien este link:

http://www.forosdelweb.com/f18/subir-archivos-grandes-mysql-linux-294768/



PHP:

WINDOWS Y LINUX:

En el php.ini

file_uploads = On // en On

max_execution_time = 120 // los segundos que consideren

max_input_time = 120 // los segundos que consideren

memory_limit = 16M // por lo regular el mismo tamaño del archivo a subir o quizas mas

upload_tmp_dir = /xyz // su directorio temporal con permisos de R/W

post_max_size = 10M // el tamaño maximo de su archivo a subir

upload_max_filesize = 10M // el tamaño maximo de su archivo a subir


*** Hacer restricciones en su código a cerca del tamaño máximo de los archivos que quieren subir (para ver que en realidad sube a MySQL o NO)

SI LO VAN A HACER EN LINUX:

consideren lo siguiente:

PHP:

si no tienen este archivo (php.conf) en este directorio (conf.d) HAY QUE CREARLO:

Yo lo he creado aqui:

/usr/local/apache2/conf.d/php.conf


con el siguiente contenido en el php.conf:


# PHP Configuration for Apache
# Load the apache module
#LoadModule php4_module modules/libphp4.so

# Cause the PHP interpreter handle files with a .php extension.

### ESTO SERÁ LO IMPORTANTE
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 10240000 // PARA 10MB o +
</Files>
### LO ANTERIOR FUE LO IMPORTANTE

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

# Add index.php to the list of files that will be served as directory
# indexes.
DirectoryIndex index.php



APACHE:

DENTRO DEL httpd.conf del Apache incluir el archivo que creamos de la siguiente manera como lo indico:

...
Listen 80

# Dynamic Shared Object (DSO) Support
# To be able to use the functionality of a module which was built as a DSO you ...

LoadModule php4_module modules/libphp4.so

### ASI LO INCLUYEN
Include conf.d/*.conf
...

REINICIAN EL APACHE: /usr/local/apache2/bin/
./apachectl restart




MYSQL:

WINDOWS:

Busquen el archivo de configuración de Mysql; se puede llamar así: my.ini y lo configuran:

//my.ini en mi caso y esta en c:\windows\my.ini


y agregarle la siguiente línea:

set-variable = max_allowed_packet=10M // para 10MB

la siguiente línea solo la descomente(le quite el #):

set-variable=key_buffer=10M

pero con la de arriba es mas que suficiente ya que lo comprobe, aunque al final deje la de abajo también configurada.


LINUX:

Hacer lo mismo que en Windows solo que haora el archivo se llama: my.cnf o my.cfg o my.conf

busquenlo desde la consola asi: locate my.cnf
si no lo encuentra el sistema busquenlo ustedes mismos, debe de estar ubicado en: /etc/my.cnf; una vez localizado lo configuramos:


en la sección [mysqld] editamos o agregamos (según su caso):

key_buffer = 16M
max_allowed_packet = 10M // los 10 MB
table_cache = 64
sort_buffer_size = 10M // Yo lo deje asi
read_buffer_size = 10M // Yo lo deje asi
myisam_sort_buffer_size = 8M

OJO: mysql tiene por default 4 archivos de configuración para que los editemos y estos son y estan en:

/usr/local/mysql/support-files/

my-huge.cnf
my-large.cnf
my-medium.cnf
my-small.cnf

CHEQUENLOS Y PUEDEN EDITARLOS LES ACONSEJO QUE LO HAGAN UNICAMENTE EN LA SECCIÓN de [mysqld]


*** EN DADO CASO DE QUE NO HAYAN ENCONTRADO EL ARCHIVO my.cnf (como fue mi caso) hay que crearlo o copiarlo asi:

cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

COMO LES DIJE ARRIBA ESA ES LA RUTA EN LA QUE DEBE DE ESTAR: /etc/my.cnf. Apartir de hay, modifican lo que les comento, pero principalmente estas 2 lineas:

key_buffer = 16M
max_allowed_packet = 10M // los 10 MB

REINICIAN EL MYSQL: /etc/init.d/
./mysql.server stop
./mysql.server start


ASI ES QUE SI USTEDES QUIEREN SUBIR ARCHIVOS A MYSQL MAYORES A 1 MB CON LO ANTERIOR LO PUEDEN RESOLVER YA QUE YO LO HE RESUELTO ASÏ, Y PRINCIPALMENTE PARA AQUELLOS QUE OCUPEN CÓDIGO SIMILAR AL SIGUIENTE:

<?
$archivo = $_FILES["archivito"]["tmp_name"];
$tamanio = $_FILES["archivito"]["size"];
$tipo = $_FILES["archivito"]["type"];
$nombre = $_FILES["archivito"]["name"];
$titulo = $_POST["titulo"];
if ( $archivo != "none" )
{
$fp = fopen($archivo, "rb");
$contenido = fread($fp, $tamanio);
$contenido = addslashes($contenido);
fclose($fp);

$qry = "INSERT INTO archivos ...

para los que NO quieran subir archivos a MySQL sino que los quieran subir a su disco duro solo configuren lo basico que encuentran en este mismo foro y con eso jala, les dejo el codigo, probado en WINDOWS/LINUX:


$upload = $_FILES[upload];
$upload_tmp = $_FILES['archivoCor']['tmp_name'];
$upload_name = $_FILES['archivoCor']['name'];
$destino ="{$_SERVER['DOCUMENT_ROOT']}/pentiumonce/".$areaArt."/{$_FILES['archivoCor']['name']}";
move_uploaded_file($upload_tmp,$destino) or DIE("Upload incorrecto");
echo "<BR><BR><BR>Archivo cargado correctamente";



Un saludo.