首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java运行PHP

从Java运行PHP
EN

Stack Overflow用户
提问于 2012-11-29 19:05:07
回答 2查看 1.2K关注 0票数 0

我正在尝试从java文件中运行以下代码。

我正在尝试显示php版本,稍后将更改为运行php文件。

代码语言:javascript
复制
 Process p = Runtime.getRuntime().exec("cmd /C PHP/php.exe -v");
 BufferedReader in = new BufferedReader(new InputStreamReader(
                p.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

当我运行程序时,没有任何错误。但是控制台没有显示任何内容:(

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-11-29 19:06:53

您必须使用wait才能执行进程,并且必须分隔参数:

代码语言:javascript
复制
Process p = Runtime.getRuntime().exec("cmd", "/C", "PHP/php.exe", "-v");
BufferedReader in = new BufferedReader(new InputStreamReader( p.getInputStream()));
p.waitFor();
String line = null;
while ((line = in.readLine()) != null) {
     System.out.println(line);
}

顺便说一句,任何时候你在运行进程时遇到问题,看看the error stream都是个好主意。

票数 4
EN

Stack Overflow用户

发布于 2012-11-29 19:14:57

我怀疑该问题是以下问题之一:

例如,

  • php.exe根本没有运行,因为PHP/php.exe应该是PHP\php.exe或其他值。
  • 该命令正在将版本信息写入其"error“流,而不是"output”流。

无论哪种方式,您都需要尝试从错误流中读取。您应该会看到版本信息或来自cmdphp.exe的错误消息。

我也应该详细解释为什么@dystroy的答案是错误的。

exec所做的是创建一个新的外部进程来运行该命令。这个进程连接到JVM,这样当您的应用程序写入getOutput()流时,它将转到外部进程的“标准输入”,而当外部进程写入其“标准输出”和“标准错误”时,可以分别使用getInput()getError()流读取数据。

各个流之间的连接是使用操作系统提供的“管道”来实现的。

管道的问题是它只有有限的缓冲容量。如果一个进程正在向一端写入,而另一个进程没有读取,则写入进程最终将被迫停止写入。或者更准确地说,它将阻塞写入系统调用,等待流水线排出。

@dystroy的答案是在Java端这样做:

启动进程的process.

  • Wait以complete

  • Read
  1. 进程的输出。

但是,如果外部进程写入大量输出,它将无法完成,因为它将在写入管道时被阻塞。同时,Java端正在等待外部进程完成,然后才开始从管道读取数据。

死锁。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13624346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档