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

时间:2010-07-28 05:51:42

标签: java php architecture memcached

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

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

请记住:

  • PHP的多个实例可能需要同时与此Java进程通信。
  • 如果找不到Java实例(例如:由于某种原因它崩溃了),PHP应该通过使用较旧和较慢的MySQL方法来进步。
  • 可以接受诸如Memcache之类的中间过程。
  • 理想情况下,解决方案可以抵御竞争条件。
  • 我最好不要使用MySQL作为中介。

我打算使用Memcache,PHP将写入已知密钥并进行轮询,直到该密钥更改为“已完成”,同时Java将轮询该密钥,并且一旦发现某些内容执行该作业并将其设置为“已完成” 。但是,由于两个原因,这不起作用。首先,PHP和Java使用序列化对象读取/写入Memcache,并且没有办法改变它,我不希望Java反序列化PHP对象,反之亦然 - 它太乱了。其次,这不符合ACID - 如果在那里建立的队列会有竞争条件。

现在,我坚持轮询MySQL“选择”以查看作业是否已脱离队列,这远非最佳解决方案,因为轮询时间需要较慢,因此MySQL无法获得太频繁了。我需要一个更好的解决方案!

感谢。

编辑:Duh。看起来我将在Java中使用某种SocketServer,我对此并不熟悉。一个例子可能会有所帮助:)

2 个答案:

答案 0 :(得分:7)

我在Java端使用套接字服务器,在PHP端使用PHP套接字。效果很好。

没有必要使用PHP / Java桥接过度复杂化,也不需要创建Web服务器的开销。

套接字工作得很好,我实际上有点惭愧,我甚至要求问题开始工作。

答案 1 :(得分:1)

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

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

这些解决方案都是严格基于网络的,并且它们都在单独的线程上工作,因此它们可以保证您的良好性能。