que - ¿Cómo puedo comunicarme entre PHP y un programa Java?
jradiobutton para que sirve (3)
Estoy utilizando el servidor de socket en el extremo de Java y los sockets de PHP en el extremo de PHP. Funciona genial.
No hay necesidad de complicar demasiado las cosas con PHP / Java bridge, y no hay necesidad de sobrecargar un servidor web.
Los enchufes funcionan muy bien, y en realidad estoy un poco avergonzado. Incluso pedí que la pregunta comenzara a funcionar.
Estoy trabajando en una aplicación web que frecuentemente requiere una consulta de cálculo intenso, cuyos resultados se almacenan en una tabla separada. Usando MySQL, esta consulta toma alrededor de 500ms (lo más optimizado posible, créanme). Para eliminar este cuello de botella, he creado un programa Java que carga los datos de base de datos relevantes en la memoria y realiza la consulta en sí; toma alrededor de 8ms (algo de lo que estoy un poco orgulloso). Me gustaría utilizar este programa Java para obtener los resultados, y si falla o no está disponible, conmutación por error para que PHP ejecute una consulta MySQL.
Como cargar los datos en la aplicación Java toma algo de tiempo, se cargará una vez y se seguirá ejecutando como proceso en segundo plano. Ahora, la pregunta es ¿cómo me comunico con esta aplicación Java a través de PHP?
Tenga en cuenta:
- Múltiples instancias de PHP pueden necesitar comunicarse con este proceso de Java simultáneamente.
- Si no se puede encontrar la instancia de Java (p. Ej., Se bloquea por alguna razón), PHP debería progresar utilizando el método MySQL más antiguo y más lento.
- Un proceso intermediario, como Memcache, es aceptable.
- Idealmente, la solución resistiría las condiciones de carrera.
- Preferiría no utilizar MySQL como intermediario.
Iba a usar Memcache, donde PHP escribiría en una clave conocida y sondearía hasta que esa clave cambiara a "completada", mientras tanto Java sondearía esa clave y una vez que encontrara algo realizaría el trabajo y lo configuraría como "completado". Sin embargo, esto no funcionaría por dos razones. En primer lugar, tanto PHP como Java leen / escriben a Memcache utilizando objetos serializados, y no hay forma de cambiar eso, y no quiero que Java extratermine los objetos de PHP y viceversa, es demasiado desordenado. En segundo lugar, esto no es compatible con ACID: si se formara una cola, existirían condiciones de carrera.
Por ahora, estoy atascado con el sondeo de "selecciones" de MySQL para ver si un trabajo está fuera de la cola o no, lo que está lejos de ser una solución óptima porque el tiempo de sondeo debe ser más lento para que MySQL no se haga ping con demasiada frecuencia . Necesito una mejor solución!
Gracias.
Editar: Duh. Parece que usaré algún tipo de SocketServer en Java, con el que no estoy familiarizado. Un ejemplo podría ayudar :)
Mi sugerencia es usar WebServices ... Escribir y ejecutar webservice en Java, y luego solicitarlo en php usando fe NuSOAP. Esta solución tiene una ventaja más: su servicio web se puede usar fácilmente en otras aplicaciones, como fe .NET ...
Otra opción que podría ser más fácil si tiene pocos métodos es crear Servlet en Java, que tomará los parámetros como solicitud GET.
Ambas soluciones están estrictamente basadas en la web, y ambas trabajan en hilos separados, por lo que garantizan un buen rendimiento.