Java 在一个进程调用期间执行多个stdin/stdout操作

Java 在一个进程调用期间执行多个stdin/stdout操作,java,php,google-closure-compiler,Java,Php,Google Closure Compiler,我使用Google Closure编译器使用PHP自动编译javascript(需要这样做-在PHP中,在Windows机器上没有安全限制)。我编写了一个简单的PHP脚本,它调用process,将.js内容传递给stdin,并通过stdout接收重新编译的.js。它工作得很好,问题是,当我编译例如40.js文件时,在强大的机器上几乎需要2分钟。然而,延迟的主要原因是java为每个脚本启动.jar应用程序的新实例。有没有办法修改下面的脚本,只创建一个进程,并在进程结束前多次发送/接收.js内容 f

我使用Google Closure编译器使用PHP自动编译javascript(需要这样做-在PHP中,在Windows机器上没有安全限制)。我编写了一个简单的PHP脚本,它调用process,将.js内容传递给stdin,并通过stdout接收重新编译的.js。它工作得很好,问题是,当我编译例如40.js文件时,在强大的机器上几乎需要2分钟。然而,延迟的主要原因是java为每个脚本启动.jar应用程序的新实例。有没有办法修改下面的脚本,只创建一个进程,并在进程结束前多次发送/接收.js内容

function compileJScript($s) {
    $process = proc_open('java.exe -jar compiler.jar', array(
        0 => array("pipe", "r"), 1 => array("pipe", "w")), $pipes);
    if (is_resource($process)) {
        fwrite($pipes[0], $s);
        fclose($pipes[0]);
        $output = stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        if (proc_close($process) == 0) // If fails, keep $s intact
            $s = $output;
    }
    return $s;
}
我可以看到几个选项,但不知道是否可行以及如何实现:

  • 创建一次进程,并仅为每个文件重新创建管道
  • 强制java将JIT ed.jar保存在内存中,以便更快地重新执行
  • 如果PHP不能做到这一点,可以使用bridge(另一个每次都会快速启动的.exe文件,传输stdin/out并将其重定向到正在运行的编译器;如果存在类似的情况)

  • 这实际上是两个进程之间的协调问题

    在这里,我编写了一个快速的10分钟脚本(只是为了好玩),它启动一个JVM并发送一个整数值,java解析并返回递增的。。哪个PHP会无限期地将其发送回

    PHP.PHP 您应该开始看到打印的数字如下所示:

    1
    2
    3
    .
    .
    .
    
    请注意,虽然这些数字是由PHP打印的,但它们实际上是由Java生成的,我认为从您的列表中选择1是不可能的,因为
    compiler.jar
    需要本机支持以保持进程的活动性,而这是不可能的(如果你认为一个压缩算法在它开始处理数据之前需要整个输入,那么这个过程就不存在了,这是有意义的。

    据一些人说,他们已经能够通过

    Nailgun是用于运行Java程序的客户端、协议和服务器 从命令行启动,而不会产生JVM启动开销。 程序在服务器上运行(用Java实现),并且 由处理所有I/O的客户端(用C编写)触发

    import java.util.Scanner;
    
    class Java {
    
      public static void main(String[] args) {
    
        Scanner s = new Scanner(System.in);
    
        while (s.hasNextInt()) { // <-- blocking read
          int i = s.nextInt();
          System.out.print(i + 1); // <-- send it back
          System.out.print('\n');
          System.out.flush();
        }
      }
    }
    
    $ php PHP.php
    
    1
    2
    3
    .
    .
    .