如何在PHP和Java程序之间进行通信?

如何在PHP和Java程序之间进行通信?,java,php,architecture,memcached,Java,Php,Architecture,Memcached,我正在开发一个web应用程序,它经常需要运行计算密集型查询,查询结果存储在一个单独的表中。使用MySQL,这个查询大约需要500ms(相信我,尽可能优化)。为了消除这个瓶颈,我创建了一个Java程序,将相关的DB数据加载到内存中,并自行执行查询;大约需要8毫秒(我有点自豪)。我想使用这个Java程序来获得结果,如果它失败或不可用,请故障切换到让PHP运行MySQL查询 由于将数据加载到Java应用程序中需要一些时间,因此它将加载一次数据,并保持作为后台进程运行现在的问题是如何通过PHP与这个Ja

我正在开发一个web应用程序,它经常需要运行计算密集型查询,查询结果存储在一个单独的表中。使用MySQL,这个查询大约需要500ms(相信我,尽可能优化)。为了消除这个瓶颈,我创建了一个Java程序,将相关的DB数据加载到内存中,并自行执行查询;大约需要8毫秒(我有点自豪)。我想使用这个Java程序来获得结果,如果它失败或不可用,请故障切换到让PHP运行MySQL查询

由于将数据加载到Java应用程序中需要一些时间,因此它将加载一次数据,并保持作为后台进程运行现在的问题是如何通过PHP与这个Java应用程序通信?

请记住:

  • PHP的多个实例可能需要同时与该Java进程通信
  • 如果找不到Java实例(例如:它因某种原因崩溃),PHP应该使用更老、速度更慢的MySQL方法
  • 可以接受中间进程,例如Memcache
  • 理想情况下,该解决方案能够承受竞争条件
  • 我最好不要使用MySQL作为中介
我打算使用Memcache,在这里,PHP将写入一个已知的键并轮询,直到该键变为“completed”,同时Java将轮询该键,一旦找到某个对象,就执行该任务并将其设置为“completed”。然而,由于两个原因,这是行不通的。首先,PHP和Java都使用序列化对象读/写Memcache,这是无法改变的,我不希望Java取消PHP对象的序列化,反之亦然——这太混乱了。第二,这是不符合ACID的——如果队列建立起来,就会出现竞争条件

目前,我一直在使用轮询MySQL“选择”来查看作业是否离开队列,这远远不是一个最佳解决方案,因为轮询时间需要更慢,这样MySQL就不会太频繁地被ping。我需要一个更好的解决方案

谢谢


编辑:Duh。看起来我将使用某种我不熟悉的Java SocketServer。举个例子可能会有所帮助:)

我的建议是使用Web服务。。。用Java编写并运行webservice,然后使用f.e.NuSOAP在php中请求它。此解决方案还有一个优点-您的Web服务可以轻松地用于其他应用程序,如f.e..NET

如果有少量方法,另一个可能更容易的选择是在Java中构建Servlet,它将把参数作为GET请求


这两种解决方案都是严格基于web的,并且都在单独的线程上工作,因此它们保证了良好的性能。

我在Java端使用socket server,在PHP端使用PHP socket。效果很好

不需要使用PHP/Java桥使事情过于复杂,也不需要创建web服务器的开销


插座工作得很好,实际上我有点惭愧,我甚至问了这个问题才开始工作。

谢谢你的意见!我选择使用普通的SocketServer,这样可以减少使用Web服务的开销。使用WebServices会允许其他应用程序连接到它,这是一个很好的观点,但目前这是不必要的。如果您仍然对我的答案感到满意,请将其标记为已回答;)11年后,你是如何做到这一点的?