usando un archivo de texto plano como base de datos_ alternativa ligera a sql _ autonomía digital y...

Upload: angel-adrian-guevara-flores

Post on 09-Oct-2015

43 views

Category:

Documents


2 download

TRANSCRIPT

  • Blog deAlfonso Snchez Uzbal, aka skotperez

    rsstg+gh

    Autonoma digital y tecnolgicaCdigo e ideas para una internet distribuida

    BlogLinkoteca

    Autonoma digitalCultura libreDesarrollo webDiseo grficoGNU/LinuxScripting y programacinUsabilidadVisualizacin de datosWordPress

    Buscar entradas

    Usando un archivo de texto plano como base de datos: alternativa ligera a SQL10 de mayo de 2013

    Hay aplicaciones web para las que una base de datos SQL se le queda grande. Una base de datos SQL necesita un servidorde base de datos que consume no pocos recursos en nuestra mquina; adems la base de datos necesita ser creada, junto a losusuarios y sus permisos, hace falta configurar correctamente codificaciones, crear las diferentes tablas

    Por otro lado, aunque los archivos SQL son archivos de texto plano, su edicin manual, sin utilizar los comandos que prove unintrprete, como PHP por ejemplo, es tediosa. Para utilizar un conjunto de datos ya generado, generalmente hay que programarun script que los formatee segn la sintaxis SQL para poder insertarlos en la base de datos.

    Por qu no utilizar un archivo de texto plano como base de datos? Esto nos ahorra todo el trabajo relacionado con elservidor de base de datos. Adems permite trabajar directamente con un archivo editable por una persona.Las aplicaciones web que usan este sistema no necesitan instalacin propiamente dicha, basta con subir unos archivos PHP anuestro servidor web. Actualizar el contenido de la pgina es tan fcil como editar un archivo de texto y subirlo.

    Como con una base de datos SQL, seguimos disfrutando de las ventajas de tener los datos y el cdigo separados. Casi todas lasaplicaciones para manejar datos permiten exportar a un archivo de texto plano, tipo CSV, lo cual evita tener que programar unconversor para incorporar datos de manera masiva a nuestra aplicacin web.

    Todo ventajas. Vamos a ver cmo podemos ponerlo en prctica.PHP incluye un conjunto de comandos para comunicarse con un archivo de texto: abrirlo, leerlo y escribir en l. A grandesrasgos todo lo que tenemos que hacer es:

    Seguir un orden a la hora de guardar los datos en el archivo de texto, generar una estructura que PHP pueda interpretar.Acceder a los datos del archivo desde PHP y ordenarlos en una matriz para poder usarlos.Recorrer la matriz con un loop para generar la salida HTML.

    La base de datos: el archivo de texto plano

    Como ejemplo vamos a pensar en un archivo llamado contactos.txt que, a modo de agenda, contiene informacin sobrenuestros contactos. Una buena manera de estructurar los datos podra ser la siguiente:

    Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...

    1 de 7 26/08/2014 08:45 p.m.

  • Nombre contacto 1|email contacto 1|website contacto 1|telfono contacto 1Nombre contacto 2|email contacto 2|website contacto 2|telfono contacto 2

    Bsicamente nos tenemos que preocupar de que en cada lnea haya un registro (un contacto en nuestro ejemplo), que cadacolumna siempre contenga el mismo tipo de informacin, y que las celdas estn separadas siempre por el mismo caracter, a serposible que no vayamos a usar en su contenido.

    Accediendo a los datos del archivo con PHP

    Para acceder al archivo usamos la funcin fopen() de PHP. El parmetro r indica que estamos abriendo el archivo solo para leersu contenido y coloca el puntero que lo ir recorriendo al principio.

    Una vez ledo el archivo desde PHP y extrada la informacin, lo cerramos con fclose():

    Para que PHP pueda acceder al archivo, tenemos que asegurarnos de que los permisos del archivo estn correctamenteconfigurados y la ruta que proporcionamos a la funcin fopen sea correcta. La entrada del manual de php.net sobre fopencontiene informacin detallada sobre posibles problemas.

    Montando el loop y generando la salida HTML

    La funcin feof() comprueba si el puntero que recorre el archivo ha llegado al final de ste.La funcin fgets() devuelve la lnea completa en la que est situado el puntero del archivo. Podemos limitar la salida defgets en bits (1024, 2048) si las lneas son largas y no las necesitamos completas.

    El cdigo completo:

    1 $fp = fopen('contactos.txt','r');2 if (!$fp) {echo 'ERROR: No ha sido posible abrir el archivo. Revisa su nombre y sus

    permisos.'; exit;}

    1 fclose($fp);

    1 $loop = 0; // contador de lneas2 while (!feof($fp)) { // loop hasta que se llegue al final del archivo3 $loop++;4 $line = fgets($fp); // guardamos toda la lnea en $line como un string5 // dividimos $line en sus celdas, separadas por el caracter |6 // e incorporamos la lnea a la matriz $field7 $field[$loop] = explode ('|', $line);8 // generamos la salida HTML9 echo '10 11 Nombre: '.$field[$loop][0].'12 Email: '.$field[$loop][1].'13 Website: '.$field[$loop][2].'14 Telfono: '.$field[$loop][3].'15 16 ';17 $fp++; // necesitamos llevar el puntero del archivo a la siguiente lnea18 }

    1 $fp = fopen('contactos.txt','r');2 if (!$fp) {echo 'ERROR: No ha sido posible abrir el archivo. Revisa su nombre y sus

    permisos.'; exit;}3 4 $loop = 0; // contador de lneas5 while (!feof($fp)) { // loop hasta que se llegue al final del archivo6 $loop++;7 $line = fgets($fp); // guardamos toda la lnea en $line como un string8 // dividimos $line en sus celdas, separadas por el caracter |9 // e incorporamos la lnea a la matriz $field10 $field[$loop] = explode ('|', $line);11 // generamos la salida HTML12 echo '13 14 Nombre: '.$field[$loop][0].'15 Email: '.$field[$loop][1].'16 Website: '.$field[$loop][2].'17 Telfono: '.$field[$loop][3].'

    Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...

    2 de 7 26/08/2014 08:45 p.m.

  • Casi todo este manual est basado en el estupendo artculo sobre el tema publicado en designdetector.

    ContextoDesarrollo web, base de datos, CSV, fclose, feof, fgets, fopen, MySQL, opendata, PHP, sqlAutorAlfonso Snchez Uzbal, aka skotperezContenido relacionado

    Razn y ser de la programacin abierta y distribuida, sesin en #thinkcommonsCmo incluir un archivo en una variable: funciones de control de salida y bufers en PHPCmo ejecutar PHP peridicamente con cron en un servidor LinuxNuevas plataformas para blogs, recuperando la esencia del bloggingMigrar grandes (y pequeas) bases de datos, fcilmente y sin limitaciones, usando la lnea de comandos

    Compartir

    tfg+

    13 comentariosPor MIQUEL BORDERA SALADIE 18 de marzo de 2014

    Hola:

    Yo en mis aplicaciones web (tanto en internet como en entornos land) estoy usando bases de datos utilizando archivos detexto plano accediendo a ellos utilizando PERL. Lo que pasa es que para archivos muy grandes (digamos de varios miles odecenas de miles de registros) lo que hago es poner la condicion de que los registros tengan el mismo numero decaracteres, aunque sean espacios en blanco puestos de forma automatica.

    Esta condicion tiene la ventaja de poder acceder y modificar directamente a un registro (respetando, eso si, la longitudmaxima de caracteres) sin tener que cargar todo el archivo en un array para modificarlo en memorya y luego reescribirlotodo en el disco duro.

    El hecho de manejar archivos planos desde tu propio programa ademas, siempre que tu programa sea eficiente, hace quesea un acceso muy rapido, puesto que no hace falta utilizar intermediarios.

    Yo nunca modifico mis archivos manualmente porque la interfaz de mis aplicacones me permite hacerlo de forma directa.No obstante podria hacerse manualmente siempre y cuando se respetara la longitud fija de cada linea de texto o sereprocesara con una sencilla aplicacion el archivo una vez modificado para ajustar las longitudes de las lineas de texto.Obviamente esto es una alternativa a las bases de datos SQL sin desmerecerlas por ello.

    Un saludo.

    Miquel

    1.

    Por skotperez 24 de marzo de 2014

    Gracias por compartir aqu tu solucin, Miguel. Efectivamente estas soluciones son alternativas a SQL endeterminados proyectos que no necesitan una gran infraestructura de base de datos. Esto no significa que haya queabandonar por completo SQL, nicamente que hay proyectos a los que les viene mejor otro tipo de gestin de losdatos.

    No entiendo por qu los registros tienen que tener un nmero de caracterres fijo.Un saludo

    1.

    18 19 ';20 $fp++; // necesitamos llevar el puntero del archivo a la siguiente lnea21 }22 23 fclose($fp);

    Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...

    3 de 7 26/08/2014 08:45 p.m.

  • Por MIQUEL BORDERA 24 de marzo de 2014

    Hola:

    El hecho que los registros tengan un tamao fijo tiene dos grandes ventajas:1-. Puedes acceder directamente a un registro sin tener que recorrer todo el archivo. Por ejemplo, si cada registro tiene 150caracteres (sean los que sean) y quieres ir al registro 20000, lo unico que tienes que hacer es poner el puntero del ficheroen la posicion 150 x 20000 = 3000000.2-. Si la longitud fija de los registros esta bien estimada como la longitud maxima que vas a necesitar en el futuro, puedesmodificar tranquilamente el registro 20000 sin sobreescribir el registro 20001 y sin que el resto de registros desplacen suposicion fisica dentro del archivo y sin tener que reescribir todo el archivo. Si en el futuro se diera el caso que necesitarasmas longitud para tus registros podrias o bien redimensionar el archivo con un sencillisimo programa que puedes hacerte tumismo o bien puedes poner desde un principio un campo en cada registro para poder incluir un numero de registro decontinuacion del contenido de este registro en caso de necesitar mas espacio.

    Yo utilizo este formato de archivo, entre otras cosas, en una base de datos que tengo de envio y recepcion de paqueteria ylo que hago es por un lado mantener automaticamente un indice en otro archivo de texto de pqueo tamao con losnumeros de registros de pedidos no finalizados y ademas en cada registro tengo un campo que lo relaciona con lel numerosde registro del pedido anterior y posterior del mismo proveedor, de forma que con gran velocidad puedo ver en cadamomento el estado de mis pedidos. Obviamente tambien tengo una opcion para realizar una busqueda avanzada de pedidosatrasados o actuales por diferentes criterios de busqueda en donde aqui si que lo que hace es recorrer todo el archivo dearriba a abajo. Ahora bien, una vez encontrado un registro en cuestion es pan comido encontrar los registros relacionadoscon la informacion de registros relacionados guarada en el campo para tal fin. Si quiero modificar datos de un pedido,simplemente lo que hago es modificar ese registro sin tocar el resto del archivo.

    Para archivos pequeos todo esto no tiene mucho sentido, pero como mas grande es el archivo mas aficiencia ganas en losprocesos de lectura, escritura y busqueda. Todo es cuestion de hecharle imaginacion al tema.

    Un saludo.

    Miquel

    2.

    Por skotperez 25 de marzo de 2014

    Muchas gracias por la explicacin, Miquel. Es un sistema bien optimizado el que describes. Me lo apunto.

    1.

    Por Charles Xavier 24 de marzo de 2014

    HolaQuiero almacenar el archivo de texto del cual leeria y escribiria en dropbox.

    Me permite leer el archivo e imprimir los datos del archivo en una pagina .html pero cuando quiero escribir sobre el no mees posible, no me manda ningun error solo no lo hace, pero tampoco he debuggeado el codigo solo cambie los modos de laapertura del archivo (r,r+,a,a+).Ya lo valide escribiendo sobre el archivo cuando esta en la misma carpeta que la pagina .php y no tengo ningun problemalo hace de maravilla

    El archivo sobre el que escribo es .html, tambien lo probe con un .txt y tampoco funciona. Tendran alguna idea si seracuestion de permisos por parte de dropbox o como hacerlo en caso de ser posible?

    *Tengo servicio de host gratuito y solo tengo 1gb de almacenamiento, en dropbox tengo mayor capacidadsaludos

    3.

    Por skotperez 25 de marzo de 2014

    Hola Charles Xavier,

    para escribir en un archivo desde PHP debes abrirlo en modo escritura. En el ejemplo de arriba lo hemos abierto enmodo lectura, como denota el parmetro r: fopen(contactos.txt,r);

    1.

    Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...

    4 de 7 26/08/2014 08:45 p.m.

  • Puedes ver todos los modos en los que interactuar con un archivo en la pgina fopen de php.net.

    Si es un problema con Dropbox no te puedo ayudar: nunca he trabajado con l y no conozco su API.

    Por PolloFrito 23 de mayo de 2014

    Estoy buscando unas lneas de cdigo para presentar una base de datos en txt, de forma paginada (primera pgina lineas1 a 5, segunda pgina lneas 6 a 10, etc..), para presentar los resultados agrupados de 5 en 5 (o de 10 en 10 o como sedecida), estilo resultados google.. Saludos

    4.

    Por skotperez 23 de mayo de 2014

    Hola PolloFrito, este cdigo te vale. Para contar las lneas puedes usar el counter de lneas del loop: en el cdigo dearriba es la variable $loop. Con esta variable puedes decir que muestre los resultados si $loop es menor o igual que 4(empieza en 0). De esta manera, en la pgina 1 mostraras las lneas de 1 a 5; la pgina 2 puedes hacerla pasando unavariable mediante $_GET para que empiece a contar en el resultado 5.

    Si tienes dudas sobre cmo pasar variables mediante $_GET puedes consultar el post Cmo pasar variables de unapgina a otra en una web con PHP.

    Saludo

    1.

    Por Alex 07 de junio de 2014Buenas tardes, muchas gracias por el cdigo y me sirvi de mucho ya que soy nuevo programando en php y en estosmomentos estoy realizando un proyecto de tarea en la cual debo realizar la validacin de usuarios con su ID y su Passwordo su respectivo registro. La validacin de usuarios y registros ya lo tengo realizado pero Cmo puedo hacer para validar lainformacin del archivo .txt y modificar los datos especficos del usuario que haya iniciado sesin?Si me pueden colaborar con ello estar muy agradecido.Saludos

    5.

    Por skotperez 08 de junio de 2014Hola Alex,

    si el usuario inicio sesin con un formulario tienes sus datos en la variable global de php $_POST o $_GET, segn elmethod que us el formulario. Una vez que tienes los datos de sesin en variables puedes compararlos con los del archivo.txt y modificarlos o lo que necesites. Puedes echar un ojo a este otro post sobre manejo de variables $_POST y $_GET.Tambin puedes guardar los datos de sesin en una cookie. Esto te sirve para tenerlos siempre disponibles.

    6.

    Por MIQUEL BORDERA SALADIE 25 de julio de 2014Hola:

    Siguiendo con mis comentarios de mas arriba en los que hablaba de utilizar ficheros de texto con registros de iguallongitud, en forma de tabla, aadire que si el campo de busqueda de un registro sabemos con certeza que esta ordenado ensentido creciente o decreciente (ya sean numeros o caracteres alfanumericos) podemos crearnos una rutina de busquedapor biseccion en lugar de tener que recorrer todo el archivo o tener un indice paralelo con informacion adicional.

    Me explico: si tenemos un archivo, pongamos con 100000 (cien mil) registros, lo que haremos primero sera leerdirectamente el registro 50000 y comprobar si el registro buscado esta por encima o por debajo de este. Si esta por encimairemos al registro 75000 y haremos la misma comprobacion y si esta por debajo iremos al registro 25000.y haremos lomismo, hasta que el valor buscado sea el encontrado o si no existe, lo saberlo tambien con certeza. En este casosimplemente necesitaremos como mucho leer 17 registros para un valor de busqueda aleatorio, mientras que haciendolo deforma secuencial necesitariamos leer un promedio de 50000 registros, suponiendo un valor de busqueda tambien aleatorio.En terminos generales el numero de registros que necesitamos leer en una busqueda por biseccion es: n = logaridmo enbase 2 del numero de registros de nuestra base de datos.

    7.

    Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...

    5 de 7 26/08/2014 08:45 p.m.

  • Un saludo.

    Miquel Bordera

    Por Aaron Lugo 14 de agosto de 2014

    Hola

    Alfonso Snchez Uzbal, aka skotperez

    Me ah sido de mucha utilidad tu post eh aadido cosas de mi cosecha y todo va viento en popa, sin embargo no tengomucha experiencia en PHP y no eh logrado filtrar mis resultados; por ejemplo si solo quisiera mostrar a los contactos conel nombre Luis. si pudieras ayudarme me seria de gran utilidad, estar muy agradecido.

    8.

    Por skotperez 18 de agosto de 2014

    Hola Aaron,

    para hacer bsquedas en una base de datos de este tipo, contenido en un archivo de texto plano, puedes usar elmtodo que comenta Miquel en los comentarios.

    De manera ms ineficiente, aunque eficaz tambin, puedes hacer un loop con foreach y una sentencia condicionalque haga lo que quieras cuando la vuelta del loop contenga lo que ests buscando, por ejemplo Luis.

    1.

    Dejar un comentario* Nombre

    * E-mail (no se publicar)

    Sitio web

    Comentario

    No hay trackbacks

    Sobre este blogAutonoma digital y tecnolgica es el blog de Alfonso Snchez Uzbal desde 2007. En l encontrars trozos de cdigo endiferentes lenguajes de programacin (snippets), reflexiones sobre autonoma digital y tecnolgica, software libre y cultura libreen general. Los textos estn disponibes bajo Creative Commons, y el cdigo bajo GPL.

    Avsame con un correo electrnico cuando haya un nuevo comentario.

    Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...

    6 de 7 26/08/2014 08:45 p.m.

  • ProyectoscRTweetDesarrolladores en redEcometroEventweetMeipimontera34Obsoletossimplitt

    Red

    Francesco CingolaniI write about computational design, collaborative culture, food, social eating and lifestyle design in Italian, French, Spanish and English.

    Domenico Di SienaI write about Shareable City, Commons, Social Innovation, Collaborative Culture, Regional Planning, Sharing Economy in Italian, English, Spanish andFrench.

    Juan Lpez-ArangurenRepair is a process associated with usability, to restore their useful properties to an object. But not only has to do with the return to use: in repair processeswe can appreciate the aesthetics, creativity, affection and humor ... that defined a relationship between the people and their things.

    Pablo Rey MaznI write about data visualization, social movements and media monitoring in Spanish and English.

    Alfonso Snchez UzbalI write about digital autonomy, appropiated technology and internet products development, mostly in Spanish.

    Members

    Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...

    7 de 7 26/08/2014 08:45 p.m.