Używam kompilatora Google Closure do kompilowania automatycznie javascript za pomocą PHP (jest to potrzebne w ten sposób - w PHP, bez żadnych ograniczeń bezpieczeństwa na komputerze z systemem Windows). Napisałem prosty skrypt PHP, który wywołuje proces, przekazuje zawartość .js do stdin i odbiera skompilowany .js przez stdout. Działa to dobrze, problem polega na tym, że kiedy kompiluję na przykład 40 plików .js, zajmuje ona silną maszynę prawie 2 minuty. Jednak opóźnienie burmistrza jest spowodowane tym, że java uruchamia nowe wystąpienie aplikacji .jar dla każdego skryptu. Czy istnieje sposób modyfikowania poniższego skryptu w celu utworzenia tylko jednego procesu i wysłania/odebrania .js treści wiele razy przed zakończeniem procesu?Wiele akcji stdin/stdout podczas jednego wywołania procesu
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;
}
widzę kilka opcji, ale nie wiem czy jest to możliwe i jak to zrobić:
- Tworzenie procesu odtworzyć tylko raz i rur dla każdego pliku
- Siła Java zachowaj JIT-ed .jar w pamięci dla znacznie szybszego ponownego wykonywania
- Jeśli PHP nie może tego zrobić, możliwe jest użycie bridge'a (innego pliku .exe, który za każdym razem uruchamia się szybko, przesyła stdin/out i przekierowuje go do działający kompilator, jeśli coś takiego jeszcze istnieje)