2014-09-10 8 views
5

मैं PHP का उपयोग करके स्वचालित रूप से जावास्क्रिप्ट संकलित करने के लिए Google क्लोजर कंपाइलर का उपयोग करता हूं (इसे ऐसा करने के लिए आवश्यक है - PHP में, विंडोज मशीन पर कोई सुरक्षा सीमा नहीं है)। मैंने सरल PHP स्क्रिप्ट लिखी जो प्रक्रिया को कॉल करता है, stdin को .js सामग्री पास करता है और stdout के माध्यम से recompiled .js प्राप्त करता है। यह ठीक काम करता है, समस्या यह है कि जब मैं 40 .js फ़ाइलों के लिए संकलन करता हूं, तो यह लगभग 2 मिनट तक मजबूत मशीन लेता है। हालांकि, महापौर देरी इसलिए है क्योंकि जावा प्रत्येक स्क्रिप्ट के लिए .jar ऐप का नया उदाहरण शुरू करता है। प्रक्रिया को समाप्त करने से पहले केवल एक ही प्रक्रिया बनाने और प्राप्त करने/प्राप्त करने के लिए .js सामग्री को भेजने के लिए नीचे स्क्रिप्ट को संशोधित करने का कोई तरीका है?एक प्रक्रिया कॉल के दौरान एकाधिक stdin/stdout क्रियाएं

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; 
} 

मैं कई विकल्प देख सकते हैं, लेकिन अगर यह संभव हो सकता है और यह कैसे करना है पता नहीं है:

  1. प्रक्रिया हर फ़ाइल
  2. फोर्स जावा के लिए एक बार बनाएँ और केवल पाइप पुन: बहुत तेजी से पुनः निष्पादन के लिए जेआईटी-एड .jar को स्मृति में रखें
  3. यदि PHP ऐसा नहीं कर सकता है, तो पुल का उपयोग करना संभव है (एक और .exe फ़ाइल जो हर बार तेज़ी से शुरू हो जाएगी, stdin/out को ट्रांसफर करेगी और इसे रीडायरेक्ट करेगी चलने वाला कंपाइलर; अगर ऐसा कुछ भी मौजूद है)

उत्तर

5

यह वास्तव में दो प्रक्रियाओं के बीच समन्वय का विषय है।

यहाँ मैं एक त्वरित 10 मिनट स्क्रिप्ट (सिर्फ मनोरंजन के लिए) है कि एक JVM की शुरूआत और एक पूर्णांक मूल्य है, जो जावा पार्स करता है और रिटर्न की संख्या बढ़ .. जो पीएचपी बस इसे वापस विज्ञापन-अनन्त भेज देंगे भेजता लिखा था। ।

PHP.php

<?php 

echo 'Compiling..', PHP_EOL; 
system('javac Java.java'); 

echo 'Starting JVM..', PHP_EOL; 
$pipes = null; 
$process = proc_open('java Java', [0 => ['pipe', 'r'], 
            1 => ['pipe', 'w']], $pipes); 

if (!is_resource($process)) { 
    exit('ERR: Cannot create java process'); 
} 

list($javaIn, $javaOut) = $pipes; 

$i = 1; 

while (true) { 

    fwrite($javaIn, $i); // <-- send the number 
    fwrite($javaIn, PHP_EOL); 
    fflush($javaIn); 

    $reply = fgetss($javaOut); // <-- blocking read 
    $i = intval($reply); 

    echo $i, PHP_EOL; 
    sleep(1); // <-- wait 1 second 
} 

Java.java

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 
. 
. 
. 

ध्यान दें कि जब उन संख्याओं PHP द्वारा मुद्रित कर रहे हैं, वे वास्तव में जावा

द्वारा उत्पन्न कर रहे
0

मैं # 1 अपनी सूची में से नहीं लगता कि क्योंकि compiler.jar जो यह नहीं है, इस प्रक्रिया को जीवित रखने के लिए देशी समर्थन के लिए (की आवश्यकता होगी संभव है और यदि आप समझते हैं कि एक संपीड़न एल्गोरिथ्म की जरूरत है एन डेटा प्रोसेसिंग शुरू करने से पहले टायर इनपुट, यह समझ में आता है कि प्रक्रिया जिंदा नहीं है)।

Anyway to Boost java JVM Startup Speed? के अनुसार कुछ लोगों के साथ उनके JVM स्टार्टअप के समय को कम करने में सक्षम है nailgun

Nailgun है एक ग्राहक, प्रोटोकॉल, और JVM स्टार्टअप भूमि के ऊपर किये बिना कमांड लाइन से जावा कार्यक्रमों चलाने के लिए सर्वर । सर्वर में चलाए जाने वाले प्रोग्राम (जो जावा में कार्यान्वित किया गया है), और क्लाइंट द्वारा लिखित (सी में लिखे गए) हैं, जो सभी I/O को संभालते हैं।

संबंधित मुद्दे