【问题标题】:How can I communicate between PHP and a Java program?如何在 PHP 和 Java 程序之间进行通信?
【发布时间】:2011-03-21 23:36:26
【问题描述】:

我正在开发一个经常需要运行计算密集型查询的 Web 应用程序,其结果存储在单独的表中。使用 MySQL,此查询大约需要 500 毫秒(相信我,尽可能优化)。为了消除这个瓶颈,我创建了一个 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 无法获得ping 太频繁。我需要更好的解决方案!

谢谢。

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

【问题讨论】:

标签: java php architecture memcached


【解决方案1】:

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

无需使用 PHP/Java 桥接器使事情变得过于复杂,也无需创建 Web 服务器的开销。

Sockets 很好用,我什至有点惭愧我什至问了这个问题才开始工作。

【讨论】:

  • 11 年后,您是如何做到这一点的?
【解决方案2】:

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

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

这两种解决方案都严格基于网络,并且它们都在不同的线程上工作,因此它们可以保证您获得良好的性能。

【讨论】:

  • 感谢您的意见!我选择使用普通的 'ol SocketServer,它减少了使用 WebServices 的开销。使用 WebServices 将允许其他应用程序连接到它是一个很好的观点,但目前没有必要。
  • 很好,编写自己的 servlet 就可以了。如果您仍然对我的回答感到满意,请将其标记为已回答;)
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 2011-04-24
  • 2011-03-05
  • 2013-05-15
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多