2010-04-28 4 views
2

Windows에서 tomcat 6을 사용하고 있습니다. 다음은 테스트중인 코드입니다.PHP/Java 브릿지 문제

import java.io.ByteArrayOutputStream; 
import java.io.Closeable; 
import java.io.StringReader; 

import javax.script.Invocable; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 


/** 
* Create and run THREAD_COUNT PHP threads, concurrently accessing a 
* shared resource. 
* 
* Create 5 script engines, passing each a shared resource allocated 
* from Java. Each script engine has to implement Runnable. 
* 
* Java accesses the Runnable script engine using 
* scriptEngine.getInterface() and calls thread.start() to invoke each 
* PHP Runnable implementations concurrently. 
*/ 
class PhpThreads { 

    public static final String runnable = new String("<?php\n" + 
      "function run() {\n" + 
      " $out = java_context()->getAttribute('sharedResource', 100);\n" + 
      " $nr = (string)java_context()->getAttribute('nr', 100);\n" + 
      " echo \"started thread: $nr\n\";\n" + 
      " for($i=0; $i<100; $i++) {\n" + 
      " $out->write(ord($nr));\n" + 
      " java('java.lang.Thread')->sleep(1);\n" + 
      " }\n" + 
      "}\n" + 
      "?>\n"); 


       static final int THREAD_COUNT = 5; 
    public static void main(String[] args) throws Exception { 
    ScriptEngineManager manager = new ScriptEngineManager(); 
    Thread threads[] = new Thread[THREAD_COUNT]; 
    ScriptEngine engines[] = new ScriptEngine[THREAD_COUNT]; 
    ByteArrayOutputStream sharedResource = new ByteArrayOutputStream(); 
    StringReader runnableReader = new StringReader(runnable); 

    // create THREAD_COUNT PHP threads 
    for (int i=0; i<THREAD_COUNT; i++) { 
     engines[i] = manager.getEngineByName("php-invocable"); 
     if (engines[i] == null) 
     throw new NullPointerException ("php script engine not found"); 

     engines[i].put("nr", new Integer(i+1)); 
     engines[i].put("sharedResource", sharedResource); 

     engines[i].eval(runnableReader); 
     runnableReader.reset(); 

     // cast the whole script to Runnable; note also getInterface(specificClosure, type) 
     Runnable r = (Runnable) ((Invocable)engines[i]).getInterface(Runnable.class); 
     threads[i] = new Thread(r); 
    } 

    // run the THREAD_COUNT PHP threads 
    for (int i=0; i<THREAD_COUNT; i++) { 
     threads[i].start(); 
    } 

    // wait for the THREAD_COUNT PHP threads to finish 
    for (int i=0; i<THREAD_COUNT; i++) { 
     threads[i].join(); 
     ((Closeable)engines[i]).close(); 
    } 

    // print the output generated by the THREAD_COUNT concurrent threads 
    String result = sharedResource.toString(); 
    System.out.println(result); 

    // Check result 
    Object res=manager.getEngineByName("php").eval(
     "<?php " + 
     "exit((int)('10011002100310041005'!=" + 
     "@system(\"echo -n "+result+"|sed 's/./&\\\n/g'|sort|uniq -c|tr -d ' \\\n'\")));" + 
     "?>"); 

    System.exit(((Number)res).intValue()); 
    } 
} 

나는 모든 라이브러리를 추가했습니다. 파일을 실행할 때 다음 오류가 발생합니다. -

run: 
Exception in thread "main" javax.script.ScriptException: java.io.IOException: Cannot run program "php-cgi": CreateProcess error=2, The system cannot find the file specified 
     at php.java.script.InvocablePhpScriptEngine.eval(InvocablePhpScriptEngine.java:209) 
     at php.java.script.SimplePhpScriptEngine.eval(SimplePhpScriptEngine.java:178) 
     at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:232) 
     at PhpThreads.main(NewClass.java:53) 
Caused by: java.io.IOException: Cannot run program "php-cgi": CreateProcess error=2, The system cannot find the file specified 
     at java.lang.ProcessBuilder.start(ProcessBuilder.java:459) 
     at java.lang.Runtime.exec(Runtime.java:593) 
     at php.java.bridge.Util$Process.start(Util.java:1064) 
     at php.java.bridge.Util$ProcessWithErrorHandler.start(Util.java:1166) 
     at php.java.bridge.Util$ProcessWithErrorHandler.start(Util.java:1217) 
     at php.java.script.CGIRunner.doRun(CGIRunner.java:126) 
     at php.java.script.HttpProxy.doRun(HttpProxy.java:63) 
     at php.java.script.CGIRunner.run(CGIRunner.java:111) 
     at php.java.bridge.ThreadPool$Delegate.run(ThreadPool.java:60) 
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified 
     at java.lang.ProcessImpl.create(Native Method) 
     at java.lang.ProcessImpl.<init>(ProcessImpl.java:81) 
     at java.lang.ProcessImpl.start(ProcessImpl.java:30) 
     at java.lang.ProcessBuilder.start(ProcessBuilder.java:452) 
     ... 8 more 

무엇이 누락 되었습니까?

+0

@Dave : 아니요 문제가 해결되었습니다. 감사! – Bruce

답변

5

그냥이 추가 CGI "

C. (/,/usr/지방/빈, 또는 자바 아마/bin에 될 것으로 예상 자사의 인/usr/빈은 $ PATH를 확인 똑똑 할 수있다) 명령 라인 :

-Dphp.java.bridge.php_exec =는/usr/빈/php에

문제가 해결되었습니다!

+0

* 명령 줄에 추가하십시오. * .Add where? – Ravi

1

... PHP가 CGI는 ... 파일을 찾을 수 없습니다가

내가 manager.getEngineByName는 ("PHP-invocable")는 시스템 주위에 래퍼를 반환해야 같은데요 지정 PHP를 실행하기 위해 호출하지만 래퍼는 PHP 실행 파일을 어디에서 찾을 수 있는지 알지 못합니다.

는 PHP/자바 다리의 웹 사이트에서 빠른 눈에, 나는 경로가 하드 자바로 코딩되어 있음을 추론 -

"자세한 정보는 문서를 다운로드에서 INSTALL.J2EE 파일을 참조하십시오" Javadoc은이 주제에 대해 확실히 모호합니다.

당신이 그것을했다고 가정하면 컴파일시에 -cgi 버전의 PHP를 특별히 만들 필요가 있습니다. php-cgi라고하면 빠른 해킹으로 "php-

4

"WEB-INF \ cgi \ amd64-windows"디렉토리에 php5ts.dll 및 php-cgi.exe의 올바른 버전을 복사하십시오. 그런 다음 Tomcat을 다시 시작하십시오. 행운을 빕니다.

1

당신이 얻을 때 오류가있는 JavaBridge.war 배포 (창, 바람둥이)

환경 변수에 PHP 설치에 대한 경로를 지정하십시오와

Fatal Error: Failed to start PHP ["php-cgi", "-v"], reason: java.io.IOException: 
Cannot run program ""php-cgi"" (in directory "C:\Documents and Settings\Adminis 
trator"): CreateProcess error=2, The system cannot find the file specified 
Could not start FCGI server: java.io.IOException: PHP not found. Please install 
php-cgi. PHP test command was: [php-cgi, -v] 
php.java.bridge.http.FCGIConnectException: Could not connect to server 
     at php.java.bridge.http.NPChannelFactory.test(NPChannel`enter code here`Factory.java:64) 
     at php.java.bridge.http.FCGIConnectionPool.<init>(FCGIConnectionPool.jav 
a:175) 
     at php.java.bridge.http.FCGIConnectionPool.<init>(FCGIConnectionPool.jav 
a:189) 
     at php.java.servlet.ContextLoaderListener.createConnectionPool(ContextLo 
aderListener.java:541) 
     at php.java.servlet.ContextLoaderListener.contextInitialized(ContextLoad 
erListener.java:185) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContex 
t.java:4135) 
     at org.apache.catalina.core.StandardContext.start(StandardContext.java:4 
630) 
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase 
.java:791) 
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:77 
1) 
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546) 

     at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.jav 
a:1041) 
     at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.j 
ava:964) 
     at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502 
) 
     at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277) 
     at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java 
:321) 
     at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(Lifecycl 
eSupport.java:119) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 

     at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) 
     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 

     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445 
) 
     at org.apache.catalina.core.StandardService.start(StandardService.java:5 
19) 
     at org.apache.catalina.core.StandardServer.start(StandardServer.java:710 
) 
     at org.apache.catalina.startup.Catalina.start(Catalina.java:581) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 
     at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 
Caused by: java.io.IOException: File \\.\pipe\C:\Documents and Settings\Administ 
rator\Desktop\softwares\apache-tomcat-6.0.29\temp\JavaBridge3144995283109409611. 
socket not writable 
     at php.java.bridge.http.FCGIConnectException.<init>(FCGIConnectException 
.java:37) 
     ... 29 more 
Caused by: java.io.IOException: PHP not found. Please install php-cgi. PHP test 
command was: [php-cgi, -v] 
     at php.java.bridge.Util$Process.start(Util.java:1145) 
     at php.java.servlet.fastcgi.FCGIProcess.start(FCGIProcess.java:68) 
     at php.java.bridge.http.NPChannelFactory.doBind(NPChannelFactory.java:94 
) 
     at php.java.bridge.http.FCGIConnectionFactory.runFcgi(FCGIConnectionFact 
ory.java:88) 
     at php.java.bridge.http.FCGIConnectionFactory$1.run(FCGIConnectionFactor 
y.java:109) 

있다.