java - PHP调用Java过程的性能调优

标签 java php performance fork

我有一个 PHP Web 表单,它接受文件上传(图像和文本),并从中提取文本(OCR 和 .pdf、.doc 等剥离为纯文本)。文本提取是通过使用 exec 调用 jar 文件/命令行进程(我无法控制其中任何一个的源)来执行的,该进程返回文本。测试时没有问题,但是,同时上传 5 个 PDF(每个大约 5MB)时,服务器负载达到最大。整个过程(每次上传)需要 10-15 秒,负载立即恢复正常。

我假设问题出在 Java 和每个 exec 调用的 JRE 分配上;当从命令行手动调用 jar 文件时,大约需要 10 秒,因此几乎与单个上传响应相同。无法将提取作为后台进程运行,因为 HTTP 响应包含从上传的文件文本处理的“数据”。我考虑过 fork 该进程,但这对服务器负载没有帮助(可能会使情况变得更糟)。我希望避免完全用 Java 重写服务。

有没有办法预加载 Java 进程 JRE 或通过管道将连续文件传输到相同的文件或类似的东西?

最佳答案

当然,为每个请求启动一个 JVM 是一个非常糟糕的主意。这正是 Java 缓慢的地方。

应该很漂亮easy使用例如ServerSocket 。启动一个进程并向其发送请求。这不是最快的解决方案,但很简单,并且可以保证巨大的加速。

<小时/>

JAR 文件有时是“可执行文件”,但它始终是“库”。它实际上只是一个重命名的 ZIP 文件,因此您可以轻松查看里面的内容(我不会将其称为逆向工程)。有一个名为 list 的文件,其中包含对主类的引用。您可以编写自己的类,调用原始 main 或忽略它。

为此,您根本不需要修改原始 JAR。只需让您自己拥有即可,但您甚至不需要 JAR 文件。对于简单的事情,一个类就足够了。然后你就这样调用它

java -cp "old.jar;." YourClass

假设您使用的是 Windows(否则将 ; 替换为 :),YourClass 位于主包中(这通常是一个坏的想法,但对于单个类项目来说还可以),以及 YourClass.class (即 YourClass.java 的编译版本位于当前工作目录中。

<子> 我不会寻求更快、更复杂的解决方案,例如使用 ServerSocketChannel s,因为它不值得。启动一个新的 JVM 需要时间,而且,它是从解释字节码并编译它开始的……这比一些通信开销要糟糕得多。你可以节省更多微秒......

关于java - PHP调用Java过程的性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22940814/

相关文章:

PHP 从子类中获取覆盖的方法

php - session 变量不会在页面加载之间持续存在

performance - AWK/GAWK 性能

php - 显示来自多个自定义帖子类型的特定类别的帖子

java - 使用 JPA 避免结果列表中的重复项

java - 如何恢复 SWT 中小部件的默认键绑定(bind)(Ctrl+A、Ctrl+C 等)?

java - 理解字节码java

java - Mysql占用更多RAM空间并逐渐增加,没有任何下降

performance - Delphi - 如果用户仍在输入则延迟处理

java - 如果所有元素 xpath 都相同,如何区分元素