Проблема с мостом PHP / Java

Я использую tomcat 6 на окнах. Вот код, который я тестирую.

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 

Что мне не хватает?

Solutions Collecting From Web of "Проблема с мостом PHP / Java"

Просто добавьте это в свою командную строку:

-Dphp.java.bridge.php_exec = / USR / бен / PHP

Задача решена!

скопируйте правильную версию PHP php5ts.dll и php-cgi.exe в каталог «WEB-INF \ cgi \ amd64-windows». затем перезапустите Tomcat. удачи.

… php-cgi … Система не может найти указанный файл

Я предполагаю, что manager.getEngineByName («php-invocable») должен вернуть оболочку вокруг системного вызова для запуска PHP, но этот обертку не знает, где найти исполняемый файл PHP.

Быстрый взгляд на сайт для моста PHP / Java, и я делаю вывод, что путь жестко закодирован в Java – «Для получения дополнительной информации см. Файл INSTALL.J2EE из загрузки документации»,

Джавадок определенно расплывчата по этой теме.

Вам нужно специально создать версию -cgi PHP во время компиляции, предполагая, что вы это сделали, и она называется php-cgi, а затем, как быстрый хак, вы можете перенести свою файловую систему на ссылки с именем «php-cgi» (ее вероятно, ожидается в / bin, / usr / bin /, / usr / local / bin или Java может быть достаточно умным, чтобы проверить $ PATH)

C.

когда вы получаете ошибку, как

 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) 

с развертыванием JavaBridge.war в (windows, tomcat)

укажите путь для установки php в переменной среды .