Come posso comunicare tra PHP e un programma Java?

Sto lavorando a un'applicazione web che richiede spesso l'esecuzione di una query di calcolo intensa, i cui risultati sono memorizzati in una tabella separata. Usando MySQL, questa query richiede circa 500ms (il più ottimizzato ansible, credethemes). Per eliminare questo collo di bottiglia, ho creato un programma Java che carica i dati del DB rilevanti in memory ed esegue la query stessa; ci vogliono circa 8ms (qualcosa di cui sono un po 'orgoglioso). Mi piacerebbe utilizzare questo programma Java per get i risultati, e se fallisce o non è disponibile, il failover di avere PHP esegue una query MySQL.

Poiché il caricamento dei dati nell'applicazione Java richiede del tempo, verrà caricato una volta e continuerà a essere eseguito come process in background. Ora, la domanda è: come posso comunicare con questa applicazione Java tramite PHP?

Tieni a mente:

  • Più istanze di PHP potrebbero wherer comunicare simultaneamente con questo process Java.
  • Se l'istanza di Java non può essere trovata (es: si blocca per qualche motivo) PHP dovrebbe progredire usando il metodo più vecchio e più lento di MySQL.
  • Un process intermedio, come Memcache, è accettabile.
  • Idealmente, la soluzione avrebbe resistito alle condizioni di gara.
  • Preferirei preferire non utilizzare MySQL come intermediario.

Stavo per usare Memcache, where PHP avrebbe scritto su una chiave conosciuta e sondare finché quella chiave non fosse stata "completata", nel frattempo Java avrebbe interrogato quella chiave e una volta trovata qualcosa eseguiva il lavoro e lo impostava su "completato". Tuttavia, questo non functionrebbe per due motivi. In primo luogo, sia PHP che Java leggono / scrivono su Memcache usando oggetti serializzati, e non c'è modo di cambiarlo, e non voglio che Java sterializzi oggetti PHP e viceversa – è troppo disordinato. In secondo luogo, questo non è compatibile con ACID – se una coda accumulata lì sarebbe condizioni di gara.

Per ora, sono bloccato con il polling MySQL "seleziona" per vedere se un lavoro è fuori dalla coda o no, che è lontano da una soluzione ottimale perché il tempo di polling dovrà essere più lento quindi MySQL non viene pingato troppo spesso . Ho bisogno di una soluzione migliore!

Grazie.

Modifica: Duh. Sembra che userò una sorta di SocketServer in Java, che non conosco. Un esempio potrebbe aiutare 🙂

Utilizzo il socket server sul lato Java e i socket PHP sul lato PHP. Funziona alla grande.

Non è necessario complicare eccessivamente le cose con bridge PHP / Java e non è necessario sovraccaricare la creazione di un server web.

Gli zoccoli funzionano alla grande, e in realtà mi vergogno un po 'e ho persino fatto la domanda per iniziare a lavorare.

PHP / Java Bridge

Il mio suggerimento è di usare WebServices … Scrivere ed eseguire webservice in Java, quindi richiederlo in php usando fe NuSOAP. Questa soluzione ha un ulteriore vantaggio: il tuo webservice può essere facilmente utilizzato in altre applicazioni come quelle di .NET.

Un'altra opzione che potrebbe essere più semplice se si dispone di un numero ridotto di methods è la creazione di Servlet in Java che prenderà i parametri come richiesta GET.

Entrambe queste soluzioni sono strettamente basate sul Web e stanno lavorando su thread separati in modo da garantirvi buone performance.