2015-06-22 107 views
0

我正在构建一个PHP前端和Java作为后端的Web应用程序,以从定制的Lucene索引检索信息。在PHP中,我使用exec()来运行从Java lucene索引检索结果的JAR(只打印文档的metdata结果,而且我们正在处理大约300多行String或结果)。我认为结果越多,PHP搜索的速度就越慢。花费大约4-5秒来检索300行结果,但在Java中(使用Eclipse IDE),只需0.3秒或更少的时间就可以使用相同的方法检索相同的结果。我试图直接从命令行运行JAR并且搜索速度在中间Java System.out.println在使用exec()从PHP调用时需要很多时间

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

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

+0

我想检查[PHP/Java Bridge](http://php-java-bridge.sourceforge.net/pjb/)。为每个PHP请求拉起虚拟机可以非常广泛(在时间和资源方面)。 –

+0

该项目的最后更新是2013年,似乎不是那么好的建议。也有少数人下载,似乎没有基准,等等。 – jotadepicas

+0

@AdrianoRepetti。我已经尝试过“调用Java桌面应用程序方法”。来自PHP/Java Bridge。它不会将对象或输出返回给PHP。 –

回答

0

这是一个非常广泛的主题,涉及架构设计和其他许多事情。但总结一个有用的答案,我会建议你放弃当前的“exec 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 Web应用程序的麻烦。

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

+0

“为什么<简单的事情X>慢?” “哦,因为你应该用<复杂的东西Y>重写你的整个应用程序。” – immibis

+0

这是一个有效的和集体的意见。我告诉你,这个“简单”的东西不会扩展,如果你在每个Web请求中执行一个jar,都会出现很多错误。我很抱歉你没有看到它,但整个方法是错误的,这个性能问题只是一个理由。另外,请再次阅读downvote权限页面,“downvote不能替代编辑和通信”。如果你发现我的答案太复杂,或者只是离开那里。 – jotadepicas

+1

@jotadepicas,谢谢你的建议。你对exec创建一个新的子进程而不是一个线程是正确的。我在lucene教程中遇到过这样的文章,它建议使用'使用Java Lucene后端,它使用HTTP或SOAP与您的前端进行交互'。但它没有详细说明。它与Tomcat webapp技术相同吗? TY! –

0

好吧!速度问题消失了。下面是它的解决方法:

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

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

+0

嘿!很高兴你做到了。如果你觉得它接受我的答案。关于在eclipse外部部署tomcat应该不难。 Google如何用你的webapp生成一个.war文件,然后把它放到tomcat的webapps文件夹中,这就是它。如果你愿意,谷歌可以采用更复杂的方式来完成Maven构建。 – jotadepicas

+0

也可以看看这个作为替代如果file_get_contents:http://php.net/manual/en/httprequest.send.php – jotadepicas

+0

对不起,第一次使用stackoverflow,并不知道如何将其设置为答案。我正在尝试upvote,但没有足够的代表。感谢您的进一步。真的很感激它! –