1

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

我有两个需要使用 PHP 运行的用于加密和解密的 JAR。两者都在同一个脚本上运行,尽管一个会解密 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

4

2 回答 2

2

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

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

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

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

于 2012-08-30T09:52:29.087 回答
0

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

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

看到我的 JAR 保留在服务器机器上并且从不通过网络传输,我将解压缩视为可以轻松避免的额外开销。

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

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

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

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

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

于 2012-09-19T10:07:22.090 回答