2012-01-02 79 views
0

我在本地创建了一个小型php脚本,它在命令行中运行java应用程序。这个Java应用程序连续运行,永远不会结束。运行时,它输出命令行文本。这里是代码:运行时打印出shell_exec

<?php 
    set_time_limit(0); 
    $command = "java -Xms124M -Xmx124M -jar myapp.jar"; 
    $end = " 2>&1"; 
    $in = $command . $end; 
    $out = exec($in); 
    var_dump($out); 
?> 

我的问题是,输出永远不会打印,因为应用程序永远不会停止运行。有没有办法让PHP打印出应用程序正在运行时返回的每一行? 希望我在这里有意义(让我知道如果我不是)。

+0

为什么你会产生一个预计不会结束的进程?基于服务或客户端 - 服务器架构不会更好吗? – Kenaniah 2012-01-02 05:00:13

+0

'java'标记不相关。用任何语言编写的长时间运行的程序都会遇到同样的问题。 – 2012-01-02 05:03:24

+0

好吧,如果进程永远不会结束,那么您需要在不同的线程中打开它,但afaik php没有内置多线程功能。由于为每个请求打开一个JVM本身就是过度杀毒,所以我建议你使用某种形式的进程间通信(IPC),通过执​​行如下操作来启动程序的新实例:http://stackoverflow.com/questions/661546 /发送邮件从php到Java。增量更新站点应该通过JavaScript和其他请求来完成,而不是等待一个请求。编辑:好吧,我没有读“本地”的一部分,傻我 – PeterT 2012-01-02 05:03:38

回答

3

您可能想看看passthru函数和popen函数。这些应该在发生时返回输出(尽管passthru可能会缓冲输出)。

+0

在这种情况下,它意味着它以块的形式发回输出,而不是在发生时发回。 – tplaner 2012-01-02 14:57:52

0

一个解决方案是将您的进程作为后台进程启动并将输出重定向到文件。然后你可以用PHP读取输出文件,但是你真的不应该让PHP像那样运行,特别是因为你的java进程永远不会结束。更好的解决方案是使用AJAX轮询让PHP每隔几秒钟返回输出文件的最新更新。