【问题标题】:Java System.out.println takes so much time when called from PHP using exec()使用 exec() 从 PHP 调用 Java System.out.println 需要很长时间
【发布时间】:2015-06-22 09:56:11
【问题描述】:

我正在构建一个使用 PHP 前端和 Java 作为后端的 Web 应用程序,以从自定义的 Lucene 索引中检索信息。

在 PHP 上,我使用 exec() 运行从 Java lucene 索引检索结果的 JAR(仅打印出文档的元数据结果,我们正在处理大约 300 多行字符串或结果)。我认为结果越多,从 PHP 搜索的速度就越慢。检索 300 行结果大约需要 4-5 秒,但在 Java(使用 Eclipse IDE)中,使用相同方法检索相同结果只需要 0.3 秒或更短时间。我尝试直接从命令行运行JAR,搜索速度居中

于是我在Java中放了timer来调试问题,发现似乎变慢的是System.out.println()的使用。在不打印搜索结果的情况下,PHP 中的搜索速度与 Java IDE 中的一样快。

有没有一种好方法可以在不影响速度的情况下从 PHP 捕获 Java 方法的输出?我希望我的搜索引擎能够扩展并处理更多结果。顺便说一句,我正在 Windows 7 上开发。

【问题讨论】:

  • 我会检查PHP/Java Bridge。为每个 PHP 请求启动 VM 可能会非常耗时(在时间和资源方面)。
  • 该项目的最后一次更新是 2013 年,这似乎不是一个好的建议。而且下载的人太少,似乎没有基准等。
  • @AdrianoRepetti。我试过“调用 Java 桌面应用程序方法”。来自 PHP/Java 桥。它不会将对象或输出返回给 PHP。

标签: java php eclipse performance lucene


【解决方案1】:

这是一个非常广泛的主题,涉及架构设计和许多其他事情。但是总结一个有用的答案,我建议您放弃当前的“exec a jar”方法,并将您的 java 后端转换为始终在后台运行的 tomcat webapp,准备好回答,而无需每次都再次预热.

此外,这使您能够缓存结果,并水平扩展(在侧面添加另一个 tomcat 并平衡充电)等。

更重要的是,您将使用流式传输,这就是 tomcat 通过其 httpResponse 对象使用的,它的性能应该比 system.out 好得多,最后但并非最不重要的是,exec 在操作系统上创建一个新进程级别,但 tomcat 使用线程(简化并为您的场景,应该意味着更好的性能)。

我会尝试所有这些,并在谷歌上搜索一些“apache lucene php 客户端”,看看会发生什么。

编辑:看看 Apache SolR:http://lucene.apache.org/solr/features.html

是一个由 Lucene 提供支持的独立服务器,它已经具有类似 REST 的 API。这样可以省去您制作自己的 tomcat webapp 的麻烦。

编辑 2:有一个 PHP SolR 客户端:https://github.com/PTCInc/solr-php-client,但我自己没有尝试过。

【讨论】:

  • "为什么 很慢?" “哦,因为你应该使用 重写整个应用程序。”
  • 这是一个有效且有根据的意见。我告诉你,这个“简单”的东西不会扩展,如果你对每个 Web 请求执行一个 jar,很多事情都会出错。很抱歉,您没有看到它,但整个方法是错误的,这种性能问题只是一个症状。另外,再读一遍downvote权限页面,“downvote不能代替编辑和交流”。如果你觉得我的答案太复杂,或者其他什么都留在那里。
  • @jotadepicas,感谢您的建议。您对 exec 创建一个新的子进程而不是线程是正确的。我在 lucene 教程中看到了这篇文章,其中建议使用“使用 Java Lucene 后端,它使用 HTTP 或 SOAP 与前端交互”。但它没有详细说明它。它与Tomcat webapp技术相同吗?泰!
  • @jotadepicas 但是,问题不是“我怎样才能编写一个仍然可以大规模运行的 Java Web 应用程序?”,而是“为什么即使在小规模下也这么慢?”
  • @KyleK 是的,确切地说,他们提到的构建此“后端”的更常见方法之一是将其作为部署在 tomcat 服务器(或其他服务器,如码头等)中的 java webapp 来完成.这里的关键是,如果您与始终运行的进程(如 webapp)交互并通过 http(使用 XML 或 JSON)流式传输结果,您应该会获得更好的结果。但是,不要认为这是对 PHP 代码的主要重构。您应该能够或多或少地将您的 jar 代码迁移到 java servlet 中以开始,并通过 PHP http 调用到这个新后端来补充 PHP exec。
【解决方案2】:

好的!速度问题消失了。解决方法如下:

我在 Eclipse IDE 的 Tomcat 服务器上部署了一个 java 后端 Web 应用程序(由 @jotadepicas 建议),并使用 file_get_contents() 函数从 PHP 捕获输出。现在,我只需要学习如何在 XAMPP 而不是 Eclipse IDE 上的 tomcat 上设置 webapp。

感谢大家帮我解决这个问题。非常感谢@jotadepicas!

【讨论】:

  • 嘿!很高兴你成功了。如果你觉得它接受我的回答。关于在eclipse之外部署tomcat应该不难。谷歌如何用你的 webapp 生成一个 .war 文件,把它放到 tomcat 的 webapps 文件夹中,就是这样。如果您需要/想要,请在谷歌上搜索更复杂的方法来执行此操作,例如 Maven 构建。
  • 如果 file_get_contents:php.net/manual/en/httprequest.send.php
  • 对不起,第一次使用stackoverflow,不知道如何将其设置为答案。我试图投票,但没有足够的代表。感谢进一步。真的很感激!。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2013-08-13
  • 2019-04-15
  • 1970-01-01
相关资源
最近更新 更多