Foros del Web » Programando para Internet » PHP »

patron de diseño singleton con ajax

Estas en el tema de patron de diseño singleton con ajax en el foro de PHP en Foros del Web. Cordial Saludo. Estoy probando el patron de diseño singleton para cuando el servidor reciba una peticion de ajax, no cree instancias nuevas cada vez que ...
  #1 (permalink)  
Antiguo 31/08/2016, 21:41
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 8 meses
Puntos: 0
patron de diseño singleton con ajax

Cordial Saludo.

Estoy probando el patron de diseño singleton para cuando el servidor reciba una peticion de ajax, no cree instancias nuevas cada vez que hallan peticiones, sin embargo observo que en el ejercicio que estoy realizando siempre crea una nueva instancia.

Código HTML:
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<label>a</label>
 <input type="number" name="a">
 <label>a</label>
 <input type="number" name="b">
 <button id="suma">Sumar</button>
 <button id="ver">Ver</button>
</body>
</html>
<script   src="https://code.jquery.com/jquery-1.12.4.js"   integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU="   crossorigin="anonymous"></script>
<script type="text/javascript">
	$(function(){
		$("#suma").click(function(){
		 var a = $("input[name='a']").val();
		 var b = $("input[name='a']").val();
		 var json = {"uno":a,"dos":b};
		 $.post("server.php",{"suma":JSON.stringify(json)},function(data){
		 	var data = $.parseJSON(data);
		 	console.log(data);
		 	alert(data);
		 });
		});
		$("#ver").click(function(){
			$.post("server.php",{"retorna":"si"},function(data){
		  	 var data = $.parseJSON(data);
		  	 console.log(data);
		  	 alert(data);
			});
		});
	});
</script> 
Clase Modelo
Código PHP:
<?php

class modelo {
    public 
$a 0;
    public 
$b 0;
    public 
$c;
    public function 
__construct(){
    }
    public function 
suma($a,$b){
        
$this->$a+$b;
        return 
$this->c;
    }
    public function 
ver_resultado(){
        return 
$this->c;
    }
}
clase singleton
Código PHP:
<?php
include_once "modelo.php";
class 
Singleton{
    private static 
$instancia;
    private 
$opera;
    public function 
__construct(){
        
$this->opera = new modelo();
    }
    public static function 
singleton(){
        if (!isset(
self::$instancia)) {
            
$miclase __CLASS__;
            
self::$instancia = new $miclase;
            
//echo "creado";
        
}else{
            
//echo "ya creado";
        
}
        return 
self::$instancia;
    }
    public function 
suma($a,$b){
        
$data $this->opera->suma($a,$b);
        return 
$data;
    }
    public function 
ver_resultado(){
        
$data $this->opera->ver_resultado();
        return 
$data;
    }
}
Donde recibe las peticiones ajax sin embargo siempre crea una nueva instancia
Código PHP:
<?php
include_once "singleton.php";
$modelo Singleton::singleton();
if(isset(
$_POST['suma'])){
  
$data json_decode($_POST['suma'],true);
  
$suma $modelo->suma($data['uno'],$data['dos']);
  echo 
json_encode($suma);
}

if(isset(
$_POST['retorna'])){
  
$respon $modelo->ver_resultado();
  echo 
json_encode($respon);
}
  #2 (permalink)  
Antiguo 01/09/2016, 05:20
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: patron de diseño singleton con ajax

El constructor debería ser privado
__________________
Unset($vida['malRollo']);
  #3 (permalink)  
Antiguo 01/09/2016, 08:08
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: patron de diseño singleton con ajax

Cita:
Estoy probando el patron de diseño singleton para cuando el servidor reciba una peticion de ajax, no cree instancias nuevas cada vez que hallan peticiones, sin embargo observo que en el ejercicio que estoy realizando siempre crea una nueva instancia.
El problema no es del patrón, si no de conceptos. El protocolo HTTP no guarda el estado entre peticiones por lo cual cada vez que hagas una petición, el script de php se va a ejecutar y siempre creara una nueva instancia por cada petición que hagas. En este caso el patrón singleton solo garantiza una sola instancia durante la ejecución.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 01/09/2016, 16:48
 
Fecha de Ingreso: febrero-2013
Ubicación: Cali Colombia
Mensajes: 118
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: patron de diseño singleton con ajax

Cita:
Iniciado por hhs Ver Mensaje
El problema no es del patrón, si no de conceptos. El protocolo HTTP no guarda el estado entre peticiones por lo cual cada vez que hagas una petición, el script de php se va a ejecutar y siempre creara una nueva instancia por cada petición que hagas. En este caso el patrón singleton solo garantiza una sola instancia durante la ejecución.
Los mas corrécto sería un unset o un die en el servidor para liberar en memoria al finalizar la peticion ?
  #5 (permalink)  
Antiguo 01/09/2016, 17:38
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: patron de diseño singleton con ajax

No es necesario, cuando termina la ejecución se liberan los recursos en memoria.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #6 (permalink)  
Antiguo 02/09/2016, 00:23
 
Fecha de Ingreso: enero-2013
Ubicación: Santa Fe, VT
Mensajes: 68
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: patron de diseño singleton con ajax

Lo que podrías hacer por el solo hecho de probar, es usar serializacion y guardar los datos en el disco.
Cada vez que la clase se intenta instanciar deberías comprobar que exista el archivo en donde esta serializada, verificar que no caduco( si la configuraste con un lifetime) y cargar el singleton con todos sus datos.
Obviamente de esta manera el singleton es indiferente a los clientes, podrías programar por medio del uso de sesiones, pero eso ya es algo mas... rebuscado.
PD: poco practico para un sitio con muchas Request. No tengo ni idea en como afecta al disco en base a las peticiones pero como ejemplo me parece divertido. (Podrías ir mas allá y usar Redis, pero no se ni como funciona)
  #7 (permalink)  
Antiguo 02/09/2016, 11:54
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: patron de diseño singleton con ajax

Si tu serializas de todas formas en cada petición php tiene que construir nuevamente el objeto, no se cual es el problema real, pero no creo que la solución este en usar el patrón singleton de esa forma.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #8 (permalink)  
Antiguo 05/09/2016, 17:37
 
Fecha de Ingreso: enero-2013
Ubicación: Santa Fe, VT
Mensajes: 68
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: patron de diseño singleton con ajax

Cita:
Iniciado por hhs Ver Mensaje
Si tu serializas de todas formas en cada petición php tiene que construir nuevamente el objeto, no se cual es el problema real, pero no creo que la solución este en usar el patrón singleton de esa forma.
me refería a que el "singleton" recuperaría toda su data, obviamente se tendría que instanciar una vez mas, no es posible(según tengo entendido) conservar un objeto entre scripts pero si su data.
No tengo experiencia serializando objetos, pero la serializacion no conserva los valores del objeto?
  #9 (permalink)  
Antiguo 06/09/2016, 05:51
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: patron de diseño singleton con ajax

Realmente no es necesario serialize un objeto para hacer una persistencia del mismo.

Bien puedes guardar el objeto en una variable de sesión después de instanciarlo.

Luego en el resto de páginas, incluyes la clase antes de session_start y puedes utilizar el objeto sin problemas.
__________________
Unset($vida['malRollo']);

Etiquetas: ajax, singleton
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 11:09.