使用exec通过PHP运行JAR时避免JVM启动延迟

时间:2012-08-30 09:47:07

标签: java php jvm exec

有没有办法避免每次在PHP中运行exec命令时JVM启动造成的延迟?

我有两个用于加密和解密的JAR,我需要使用PHP运行。两者都在相同的脚本上运行,尽管一个解密URL参数然后另一个加密其他一些信息。当我通过命令行运行它们时,它们都在不到0.4秒的时间内完成。但是,当我使用PHP exec函数运行它们时,会启动一个新的JVM实例,它会在每个JAR执行时间上增加5秒。

我已经使用Nailgun进行了调查,但无法使用它。我找不到任何运行JAR的文档,当我使用类时,它也找不到它们。

我还考虑过使用PHP / Java Bridge。但我宁愿继续使用exec。我已经在运行IIS 7.5,我不确定如何配置网桥使用它。

我的问题是这样的:有没有办法让JVM在后台运行,这样PHP exec函数每次都不需要启动新实例?我认为必须有一种方法,因为命令行没有延迟。

如果无法做到这一点,那么我愿意接受其他建议。运行PHP脚本需要11秒,这意味着网站的访问者很可能会离开。

可能使用或未使用的其他信息:
它将在Windows Server 2008 R2 32位操作系统上运行。
仅需本地访问。
正在使用IIS服务器7.5。
网站以PHP编码。 PHP版本是5.3.5。
服务器正在运行最新的JRE - Java7 u6

2 个答案:

答案 0 :(得分:2)

  

有没有办法让JVM在后台运行,这样PHP exec函数每次都不需要启动新实例?

您可以在已知端口上启动ServerSocket。

如果它是第一次运行应用程序,这将成功,此过程可以继续运行。

如果这不成功,应用程序可以在该端口上打开一个Socket并根据需要发送命令并获得响应。

答案 1 :(得分:0)

即使接受的答案主要解决了我的问题,但JAR执行时间仍然需要稍长时间。我意识到这个问题专门针对JVM的启动时间,但如果其他人有类似的问题,这对他们也有帮助。

我一直在使用Eclipse生成可执行的JAR。我正在JAR中包装第三方JAR。在检查生成的JAR时,我注意到Eclipse添加了很多自己的类,其中一个类在清单中作为主类(它处理在JAR中加载JAR我相信)。我还注意到JAR中的所有文件都被压缩了(正如您在存档中所期望的那样)。

看到我的JAR停留在服务器计算机上并且从未通过网络传输,我将解压缩看作是一个可以轻松避免的额外开销。

我决定根据上面的信息对我的JAR进行三处简单的更改:

1)在命令行中使用java命令生成JAR并编写我自己的清单。这消除了Eclipse添加的其他类文件。

2)在通过命令行生成JAR时,我添加了0选项以禁用压缩。

3)我没有在我的JAR档案中包含第三方JAR。相反,我将它们包含在同一个文件夹中,并将它们添加到每个生成的JAR清单文件中的classpath选项中。

这减少了运行JAR所需的时间约269%。