Foros del Web » Programando para Internet » PHP »

Me pueden Corregir la funcion que acavo de terminar, Backup+Compress_Zip

Estas en el tema de Me pueden Corregir la funcion que acavo de terminar, Backup+Compress_Zip en el foro de PHP en Foros del Web. pues eso, a ver, si le pueden echar un vistazo, seguro que se puede simplificar o corregir. Código PHP: <?php //MaxBakupBd Function Creada el Domingo a las 06:00 am del 09 de Noviembre del 2003 /*INICIO DE LA FUNCION PARA REALIZAR UN BACKUP DE LA BASE DE DATOS Y COMPRIMIRLO EN ZIP*/ function  FUNC_MaxBakupBd ( ...
  #1 (permalink)  
Antiguo 08/11/2003, 23:48
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 14 años, 7 meses
Puntos: 2
Me pueden Corregir la funcion que acavo de terminar, Backup+Compress_Zip

pues eso, a ver, si le pueden echar un vistazo, seguro que se puede simplificar o corregir.

Código PHP:
<?php
//MaxBakupBd Function Creada el Domingo a las 06:00 am del 09 de Noviembre del 2003

/*INICIO DE LA FUNCION PARA REALIZAR UN BACKUP DE LA BASE DE DATOS Y COMPRIMIRLO EN ZIP*/

function FUNC_MaxBakupBd($fileNameMySqlDump,$sql_host,$sql_usuario,$sql_pass,$sql_db){//funcion para hacer un backup de la base de datos

    
function FUNC_compressZip($fileNameMySqlDump){//funcion para comprimir la base de datos en zip

            
$fileOriginal $fileNameMySqlDump.".sql";
            
$fileZip $fileNameMySqlDump.".zip";

            
$fp fopen($fileOriginal"r");//abro el fichero a comprimir
            
$datosSqlBakup fread ($fpfilesize($fileOriginal));//leo y compruebo el fichero
             
fclose($fp);//cierro el fichero a comprimir

             
$zp gzopen($fileZip"w9");// metodo de compresion, nivel 9
             
gzwrite($zp$datosSqlBakup);//escribo el fichero zip comprimido
            
gzclose($zp);//cierro el fichero zip comprimido
    
}//termino funcion zip
    

    
$sysOperative = (stristr(PHP_OS'WIN')) ? "Windows" "Linux";//compruebo el sistema operativo del servidor

    
if (empty($sysOperative)){ echo "Error 6000: Se produjo error por no encontrar el sistema operativo del servidor."; exit; }

    
$fileNameMySqlDump date("Y_d_m_H_m_s")."_".$fileNameMySqlDump;//añado la fecha y la hora al nombre del fichero

    
$db_connect mysql_connect($sql_host,$sql_usuario,$sql_pass) or die("MySQL dice: ".mysql_error());//conectamos con la base de datos
    
mysql_select_db($sql_db) or die("MySQL dice: ".mysql_error());//seleccionamos la base de datos

        
switch ($sysOperative){//creo el selector de sistema operativo

            
case 'Windows'://servidores mysql montados en maquinas windows
                
$mySqlDump "c:\mysql\bin\mysqldump.exe -u $sql_usuario --password=$sql_pass --opt $sql_db > $fileNameMySqlDump.sql";//ejecuto el backup
                
system($mySqlDump$resultMySqlDump);
            break;

            case 
'Linux'://servidores mysql montados en maquinas linux
                
$mySqlDump "mysqldump -u $sql_usuario --password=$sql_pass --opt $sql_db > $fileNameMySqlDump.sql";//ejecuto el backup
                
system($mySqlDump$resultMySqlDump);
            break;

            default:
                echo 
"Error 7000: Se produjo error por no ser un sistema compatible con Windows - Unix - Linux.";//si el sistema operativo no existe o no esta definido, error
            
exit;
            break;

        if (
$resultMySqlDump) { echo "<H1>Error ejecutando comando: $executa</H1>\n"; }//compruebo errores

    
}//termino switch

    
FUNC_compressZip($fileNameMySqlDump);//ejecuto funcion de compresion zip

}//termino funcion

/*FIN DE LA FUNCION*/

/*············································································*/

/*EJEMPLO DE COMO USAR LA FUNCION*/

$sql_host "localhost";  // Host, nombre del servidor o IP del servidor Mysql.
$sql_usuario "xxxx";    // Usuario de Mysql
$sql_pass "xxxx";     // contraseña de Mysql
$sql_db "xxxx";     // Base de datos


session_start();//inicio sessiones para que solo se ejecute el code 1 vez.
session_cache_limiter('nocache,private');//regulo la cache, para no dar error

if (empty($_SESSION['backupMySqlBd'])){//si no existe la session, ejecuto el code

    
$_SESSION['backupMySqlBd']="Realizado";//almaceno un dato cualquiera en la session

        
FUNC_MaxBakupBd("mysql",$sql_host,$sql_usuario,$sql_pass,$sql_db);

} else { echo 
"ya esta, no puedes 2 veces, espera 5 minutos";}//error, ya has hecho el backup


/*EJEMPLO DE COMO USAR LA FUNCION*/
?>
y de paso si ha alguien le gusta....

pd: Maestros, esta funcion tiene un error, cuando comprime no incluye la extension del fichero, se le olvida que es *.sql, pero bueno, funcionar funciona.
__________________
3w.valenciadjs.com
3w.laislatv.com

Última edición por nuevo; 08/11/2003 a las 23:50
  #2 (permalink)  
Antiguo 09/11/2003, 00:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
jajaj .. el "me pueden corregir" me recordó cuando iva al colegio xDD ..

Unos consejos ...

* Debes crear una documentación básica para la función .. En ella tienes que describir que parámetros acetpta la función (y de que tipo son .. ejemplo: un string .. un entero .. un array .. un objeto ...) y que devuelve al ejecutarse: un booleano (TRUE/FALSE) .. o una variable .. o nada .. etc ..

Si usas sintax para el comentario tipo:

Código PHP:
/* function tal .. descripción .. 
bla bla
bla
*/
function bla($bla){

Los editores de código tipo Maguma .. te mostraran esos comentarios de forma contextual. (Esa sintax de comentarios es tipo PHP DOC)

* Para hacer el "dump" del archivo .. usas comandos del S.O. (de Msyql pero ejecutados desde "consola") .. Muchas configuraciones de PHP (bajo "safe mode") no dejan ejecutar system() ni funciones similares para acceder a ejecutar algo en el S.O. ... Estaría bueno que controlases ese error que se va a producir en esos casos y que avises que "esta función aquí no vá por restricciones de config de PHP ..".

Ese "error" lo puedes capturar tipo:
Código PHP:
if ([email protected]system( ....)){
   echo 
"hay un error .. no se puede ejecutar comando o falló ..";

Con "@" ... se eliminan los mensajes de error que pueda producir esa llamada a esa función .. el "!" niega .. y el "if" sería lo mismo que hacer un "or die(...)" .. pero no se termina la ejecución del script .. Así .. si quieres hacer que tu función devuelva un "true" o "false" según se puedo completar lo que hace o no .. para que el resto de la aplicación que use esa función pueda gestionar el error como corresponda: dando un "echo y mostrando el mensajito" .. haciendo un "log" de errores .. etc ..

* Lo ideal es que tus funciones (en general) .. no muestren directamente ellas mismas los mensajes de error/exito que puedan ocurrir de su ejecución .. Siempre intenta hacer "return" y devolver los mensajes de error/exito al código que los llame para gestionarlarlos como corresponda (ya comenté: .. hacer log, mostrarlos o no mostrarlos en caso de error .. etc ..)

-------------

Sobre el "error" ... haz un echo a $mySqlDump antes de atacar tu system() y mira si el comando que generas (con el nombre de archivo y concatenado el .sql ...) es el correcto.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 09/11/2003, 06:30
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 14 años, 7 meses
Puntos: 2
bueeeeno gracias Cluster ;)... una preguntilla mas... a la funcion aun le faltan cosas, quiero añadir algunas cosillas mas...

seria aconsejable que lo meta todo en una Classe?, en realidad lo que falta tb usara los mismos parametros osea que podria entrar en una Classe.
__________________
3w.valenciadjs.com
3w.laislatv.com
  #4 (permalink)  
Antiguo 10/11/2003, 06:02
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues si quieres.. claro que sí. Estaría bueno dejarlo como "classe" ..

Por eso mismo te decía que tu función (esta en concreto) no haga ningún "echo" sino que devuelva alguna variable de control que haga referencia al mensaje de error/exito que se tenga que mostrar .. así yo por ejemplo podría tomar tu classe (con esa función) y hacerlo un "extended" para que en lugar de hacer "echo" de esos mensajes .. hiciera un método (módulo/classe) para crear un log en un archivo de texto plano .. por ejemplo.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 10/11/2003, 14:57
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 14 años, 7 meses
Puntos: 2
ya pero se me olvido decir, q esta que esta aqui, la he extraido de mi script, y en mi scrip si que uso otra funcion que se dedica ha generar los errores,

Código PHP:
<?php
    
if (!eregi("index.php"$PHP_SELF)) { die (FUNC_Error(51,$langError51,$sql_host,$sql_usuario,$sql_pass,$sql_db,$sql_tabla_sucesos,$ip_real)); }//comprueba si se usa el nucleo del script.
    
    
function  FUNC_Error($nErr,$textInfo,$sql_host,$sql_usuario,$sql_pass,$sql_db,$sql_tabla_sucesos,$ip_real){//FUNC_Error($nErr=1,$textinfo=$langError1);
        
echo "<body bgcolor=black>";
            for (
$generaErrAuto=1;$generaErrAuto<99+1;$generaErrAuto++) {//genero funcion errores dinamica con un bucle
                
switch ($nErr){
                case 
$generaErrAuto$this->error $textInfo; break;
                default: 
$this->error $textInfo; break;
                }
//salgo del swhtch
            
}//salgo del for
        
mysql_query("INSERT INTO $sql_tabla_sucesos values('','$textInfo',NOW(),'nombre_usuario','$ip_real')") or die("MySQL dice: ".mysql_error());

echo <<< HTML
<SCRIPT> alert("$this->error"); </SCRIPT>
<script languaje="javascript">
setTimeout ("history.back()", 1);
</script>
HTML;
}
?>
ahora la funcion para ser exactos, tb escanea todas las tablas de la base de datos, las comprueba que sean correctas de sintaxis, y le hace un optimize como dioxxx manda, asi despues empieza la funcion que estas viendo, hace el backup y comprime a zip el bakup de la base de datos, borrando despues el fichero *.sql, asi automaticamente los ficheros son almacenados en el menor espacio posible y con nombre de la fecha que se realizo.

pd: si alguien esta interesado en la funcion completa, puedo generar esta misma pero actualizada... eso si... hay que convertirla a una classe... sencillita, pero una classe...arf, arf... clasess clseessss

pd: Gracias a TODOS! por enseñarme hacer funciones, esto es una pasada, el royo esq las mezclas con cualquier cosa, y salen unos batidos de FUNC que se salen... gracias tiusss!!! sos mu grandes toss!
__________________
3w.valenciadjs.com
3w.laislatv.com

Última edición por nuevo; 10/11/2003 a las 14:59
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:22.