Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Como comunicar php con python
#1
Buenas , sigo con el tema del lector :

  La situacion es esta :

     Tenemos un lector de tarjetas en el ordenador cliente que ejecuta una aplicacion php , necesitamos que al pulsar un boton en la pagina web correspondiente , se lea el chip y se envie la info a la pagina que lo llamo.

  En estos momentos estoy asi :
      Se pulsa el boton y crea una pagina html en el servidor , se comprueba desde la aplicacion local (python ) que el documento existe , si existe se hace la lectura , se elimina el ficherp html y se graban los datos leidos en una bd mysql , estos datos son recogidos por la misma pagina y procesados  , borra el registro en la tabla. Hasta aqui todo bien , pero el servidor apache no para de registrar errores cada vez que desde la aplicacion local se consulta si existe dicho html , esto con mas de 200 ordenadores consultando si existe su archivo para hacer la lectura puede colapsar el sistema, debido a esto he hecho algunas modificaciones y este momento tengo lo que sigue :

      En lugar de crear el archivo , se crea un registro en la BD que se esta continuamente consultado desde la aplicacion local si existe , cuando existe se lanza la lectura y se graban los datos en la bd , desde la pagina php se procesan los datos y se borra el registro , esto no deberia de colapsar la bd , ya que las consultas desde la aplicacion local se hacen cada 2 segundos y seran unos 200 usuarios simultaneos , pero no me convence este sistema tampoco , ya que en algunas pruebas locales , haciendo barbaridades con el lector llego a colapsar el servidor , son cosas que un usuario normal no deberia de hacer nunca , pero y si lo hace y me tira abajo el sistema ?.


   Pues bien , he estado dandole vueltas y se me ha ocurrido ( no se si sera posible hacerlo , por eso pregunto ) que si fuera posible de alguna manera tener un scrypt en el servidor que cada vez que hay una peticion de lectura en el servidor añadiera una linea a un fichero identificando quien hace la llamada y ese fichero se enviara al cliente cada vez que hace la peticion me evitaria los colapsos , ya que el cliente no estaria continuamente comprobando si existe la pagina html (primer caso) o haciendo continuamente consultas a la bd . Seria como hacer una api y que esta devolviera un JSON , pero me gustaria manejarlo todo con python .

     Seria posible hacer esto o estoy preguntando un imposible ?
Responder
#2
Hola.

Sinceramente no terminé de entender muy bien cómo es que funciona el "backend" de tu lector. No obstante ello, la lectura y escritura de archivos es una operación más bien pesada, y en su lugar para ello están las bases de datos, mucho más eficientes, rápidas y escalables. Desconozco las prestaciones de hardware que tenga tu servidor, pero los motores de BBDD relacionales más populares como MySQL y PostgreSQL son capaces de responder a muchísima cantidad de consultas por segundo, tal vez estés teniendo problemas en algún otro lado, o bien necesites optimizar/cachear tus consultas.

De todas formas respondo a tu pregunta sobre el desarrollo web en el lenguaje. La posibilidad de hacer una web en Python al "estilo PHP" (esto es, vía CGI) te diría que la descartes. La necesidad de ejecutar el intérprete por cada petición HTTP no es para nada escalable. En su lugar, en Python se usa la especificación WSGI para desarrollar con web frameworks como Django, web2py, Flask, etc. Sin embargo, para estas tecnologías la oferta de hosting no es tan amplia como los convencionales "hosting compartidos" de PHP. Tus posibiilidades son contratar tu propio servidor virtual e instalar lo necesario (Apache, Python, etc.), usar algún PaaS como Google App Engine o Heroku, o bien, probablemente la más fácil, PythonAnywhere.

Saludos.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Te respondo , el lector accede a los datos del dni y los graba en una tabla en un servidor propio con mysql , lo que me preocupa es que para que el cliente tenga la sensacion de que la lectura se hace en tiempo real , el ordenador cliete ha de estar cada 2 segundos haciendo una cosulta a la bd de datos preguntando si el mismo ha pedido hacer lectura del dni , es decir 30 consultas x minuto , en estos momentos hay unos 200 clientes , es decir , tendriamos 6000 consultas x minuto , de las que es mas que probable que el 99% no sean peticiones , supongo que esto no sea ningun problema para la base de datos , pero estaba pensando alguna forma de evitar esas consultas que no van a devolver ningun resultado , ya que no hay peticion real de lectura , de todas formas vamos a probar con el sistema actual sobre bd y veremos como se comporta todo.
Responder
#4
Entiendo. Tal vez te convendría más utilizar una aplicación cliente-servidor TCP convencional, con algún framework de red como Twisted o Tornado, para evitar toda la sobrecarga del protocolo HTTP y el hecho de estar consultando cada dos segundos una base de datos. El servidor podría simplemente avisar con un mensaje al cliente cuando lo necesite.

De todas formas, con tu configuración actual puedes estirar un poco más el tiempo de consulta, a 5 o 10 segundos.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#5
Si , pero el problema es que si aumento el tiempo entre consultas , cuando hay una peticion real me voy a casi 20 segundos para leer el dni y luego esta tambien el dichoso problema de la peticion del pin que salta en windows cada vez que se introduce un dni en el lector que bloquea cualquier otro proceso que intente leer los datos del dni , asi que me ha tocado matar dicho proceso (dnieservice.exe) desde el mismo proceso que hace la lectura justo antes de leer , pero el formulario para introducir el pin tiene un nombre variable y ese de momento no he conseguido matarlo .
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)