Autor
|
Tema: como aliviar la carga del servidor con muchos datos y requests (Leído 6,475 veces)
|
gAb1
Desconectado
Mensajes: 731
|
En todo desarrollo llega la hora en la que nos preguntamos de qué manera hacer nuestra aplicación más eficiente, hacer las cosas de manera que suponga la menos carga posible para el servidor.
Actualmente estoy seleccionando y mostrando; a veces es una sola fila y otras hay un limite, pero hay un apartado en el que envio todas las filas al plugin JQuery DataTables. Bueno, todas las filas pero no todas las columnas, solo las necesarias y la verdad es que tendrían que ser muchas filas (como 1000 aunque no tengo ni idea) para que empezase a afectar no solo al cliente, si no al servidor tambien cuando hayan varios usuarios pidiendo a la vez.
Me gustaría saber si realmente vale la pena cachear los datos y donde sería mejor, si en una clase de php, en memcached (es el que estoy usando) o incluso en el propio cliente (he leido algo pero no estoy seguro de si se puede hacer).
En el caso de usar una clase php para cargar todas las filas supongo que tendría que convertir la navegación de mi web a AJAX para no tener que recargar todas las filas cada vez (osea que no serviria de nada la clase).
¿Teneis alguna idea más?
Gracias!
|
|
|
En línea
|
|
|
|
[u]nsigned
Desconectado
Mensajes: 2.397
JS/Node developer
|
Es una locura mandar toda la tabla a DataTables. Ademas este plugin soporta ajax de forma nativa, así te evitas programar la paginación y todo eso... https://datatables.net/manual/server-sideAdemas DataTables ya trae una clase ssp.class.php que se encarga de hacer todo el trabajo, y emplea PDO. Si queres, mas tarde puedo pasarte un ejemplo funcional de como implementar DataTables con ajax y paginación. Ademas de una versión mejorada por mi del ssp.class.php para el idioma español. Ahora estoy por cocinar xD
|
|
|
En línea
|
No hay atajo ante la duda, el misterio se hace aquí... Se hace carne en cada uno, el misterio es existir!
|
|
|
gAb1
Desconectado
Mensajes: 731
|
Las clases ya las ví pero la verdad es que prefiero usar mi propio código (me gusta que el código sea familiar). Aunque si que le dí una oportunidad a usar server-side, que básicamente es calcular el número de resultados, el número de páginas, y coger solamente el número de elementos de la página actual. El problema de esto creo que es que el buscador solo buscaría entre los elementos de la página actual y no todos (perder esta característica es algo a tener en cuenta). Por eso decidí mandarlo todo. Se me olvido mencionar que no era toda la tabla, si no todas las filas que pertenecen al usuario. Y la verdad dudo mucho que nadie llegue a tener 500 filas. Además, ¿cuanto puede pesar la información de una sola fila? Unos cuantos bytes? A ojo he calculado entre 70-100 bytes, son simples palabras, ¿cuantas filas así podría manejar un cliente? Teniendo en cuenta los datos anteriores 500 filas serían apenas 50 kb.... Ahora no me lo creo ni yo, confirma si esto es cierto Hay otra zona de la web en la que si tengo que limitar las filas por página, ya que se incluye una imagen y unas cuantas columnas. Luego habría que ver cuantos usuarios hay online accediendo a la misma zona y pidiendo cada uno sus datos. Pero para este proyecto pienso contratar un dedicado, asi que no creo que vaya a tener problemas. Entonces, ¿crees que vale la pena hacer algo como cachear o simplemente lo dejo como está?
|
|
|
En línea
|
|
|
|
[u]nsigned
Desconectado
Mensajes: 2.397
JS/Node developer
|
Las clases ya las ví pero la verdad es que prefiero usar mi propio código (me gusta que el código sea familiar).
Solo tenes que importar la clase ssp.class.php y usar la misma. Si tenes un conocimiento medio de POO con PHP 5 es super facil.Te pongo un ejemplo de como usarla: <?php header("Content-Type:application/json"); //tabla mysql $table = 'empleadores'; //Clave primaria de la tabla mysql $primaryKey = 'id'; //Array con nombre de campos e indice para DataTable array( 'db' => 'id', 'dt' => 0 ), array( 'db' => 'nombre', 'dt' => 1 ), array( 'db' => 'cuit', 'dt' => 2 ), array( 'db' => 'dom', 'dt' => 3 ), array( 'db' => 'loc', 'dt' => 4 ), array( 'db' => 'act', 'dt' => 5 ) ); //Datos de conexion mysql 'user' => 'root',//Usuairo de mysql 'pass' => 'mysql_password',//password mysql 'db' => 'db_name',//nombre de base de dato mysql 'host' => 'localhost' ); require( 'ssp.class.php' ); SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns ) ); ?>
Aunque si que le dí una oportunidad a usar server-side, que básicamente es calcular el número de resultados, el número de páginas, y coger solamente el número de elementos de la página actual. El problema de esto creo que es que el buscador solo buscaría entre los elementos de la página actual y no todos (perder esta característica es algo a tener en cuenta). Por eso decidí mandarlo todo.
Estas equivocado. DataTable hace una pèticion al servidor cada vez se modifica el input de busqueda, por lo que cada busqueda se hace en el servidor, nunca en local. Incluso si lo cambias el 'ordernar por' de las columnas. Y lo de cachear las consultas no te lo recomiendo para nada, porque limitarias el sistema a un solo usuario.
|
|
|
En línea
|
No hay atajo ante la duda, el misterio se hace aquí... Se hace carne en cada uno, el misterio es existir!
|
|
|
gAb1
Desconectado
Mensajes: 731
|
Hmm pero eso no es solo si tienes la opción server-side activada? He visto ejemplos en los que se le pasa un objeto con datos (normalmente json) y DT se encarga de todo en el cliente. Es lo mismo si los datos están en una tabla, se hace un select, y se envian todos los datos a DT. Y lo de cachear las consultas no te lo recomiendo para nada, porque limitarias el sistema a un solo usuario. No entiendo a que te refieres con eso? Como se va limitar a un solo usuario? He estado haciendo pruebas en dos tablas distintas: una tabla normal que recibe todos los datos en la primera petición y he estado viendo el monitor de red (de las herramientas de firefox) y no veo ninguna petición extra a parte de la primera cuando filtro, cambio de pagina, ordeno columnas, etc... Sin embargo en otra tabla tengo dos botones que actuan como filtros, estos botones si que envian una petición que lo que hacen es cambiar la consulta a la db y por lo tanto devuelve distintos datos (filtrados). Esta tabla si que hace un request cada vez que le doy a uno de los dos botones custom que tengo creados. Pero no cuando quiero ver/filtrar/ordenar los datos que ya tengo cacheados en el cliente. La primera tabla recibe datos en json de apenas 5.6 KB (algo insignificante) y son 3 páginas de 10 resultados. Serian menos de 20KB 100 resultados. 500 resultados serian apenas 100KB. El cliente puede manejar esa insignificante cantidad de datos perfectamente y el servidor tambien debería ser capaz de servir eso a varios usuarios a la vez sin problemas. Esta claro que depende de lo que se quiera hacer es mejor usar server-side o cliente-side para manejar datos. No soy ningún experto en este tema, pero lo que digo tiene bastante lógica, ¿no? Por favor, explica un poco mejor por que piensas que no es buena idea hacer esto. Gracias!
|
|
« Última modificación: 6 Junio 2016, 01:47 am por gAb1 »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Wifislax 3.1 con RTL8187L problemas al capturar datos (got 0 ARP requests)
Hacking Wireless
|
peruanzon
|
2
|
6,330
|
2 Mayo 2010, 23:24 pm
por zydas
|
|
|
problema con base de datos que no se carga en servidor MIARROBA.
Desarrollo Web
|
druguito
|
0
|
1,904
|
21 Marzo 2013, 23:08 pm
por druguito
|
|
|
como insertar datos en bd en otro servidor
PHP
|
General Dmitry Vergadoski
|
4
|
2,730
|
4 Febrero 2015, 16:20 pm
por MinusFour
|
|
|
no inserta datos tablas relacion referencial uno a muchos
Desarrollo Web
|
magevi
|
0
|
1,929
|
17 Febrero 2015, 21:57 pm
por magevi
|
|
|
Red sin servidor DNS ¿a qué IP mandan las requests?
« 1 2 »
Redes
|
Kaxperday
|
10
|
7,933
|
19 Agosto 2016, 15:08 pm
por warcry.
|
|