Как я могу выполнить программу Java в php-скрипте?

Я пишу простой сценарий веб-загрузки. Целью является загрузка файла с использованием php, а затем вызов java-программы для обработки этого файла.
Я выполнил работу по загрузке файла, но я не могу запустить java-программу из сценария php.
Я пробовал exec() , shell_exec() и system() без каких-либо результатов.
Для этой команды я использовал « java Test », « java < directory >/Test », « /usr/bin/java < directory >/Test », даже настроил приложение как файл jar без каких-либо результатов. Фактическая строка кода, которую я использовал:

 echo shell_exec("java Test"); 

Обычно нет выхода. Однако, если у меня есть только shell_exec("java") , тогда отображается последняя строка справки из java (« show splash screen with specified image »), которая показывает, что команда выполнена. Если я использую, например, s hell_exec("whoami") я возвращаю «никто», что является правильным. Единственное, что делает java-файл, это создать файл, чтобы я мог видеть, что приложение успешно выполнено (приложение выполняется успешно, если я запускаю его в командной строке). Я установил разрешения для java-файла на 777, чтобы исключить любую возможность ошибок разрешения. Я боролся с этим некоторое время, пытаясь использовать все варианты без каких-либо результатов – файл никогда не создается (файл создается с абсолютным путем, так что он не создается, и я просто не могу найти файл). У кого-нибудь есть идеи?

Благодарю.

Я боролся с этим некоторое время, пытаясь использовать все варианты без каких-либо результатов – файл никогда не создается (файл создается с абсолютным путем, так что он не создается, и я просто не могу найти файл). У кого-нибудь есть идеи?

То, что я думаю, проблема. Apache работает как «nobody» group? (Apache user?), Который выполнит java-скрипт, который попытается создать файл на диске где-нибудь. Я предполагаю, что у него нет разрешения на запись в это место. вы должны использовать эту папку так, чтобы пользователь Apache мог писать в эту папку.

==

Во-первых, я хотел бы указать вам, что вызов exec () из сценария может действительно взорвать ваш сервер. Я бы посоветовал вам использовать что-то вроде redis (см. Ниже).

==

Во-вторых, я думаю, что знаю, в чем проблема. Сначала вы должны попытаться запустить простой пример ниже, который отлично подходит для меня.

==

Сначала убедитесь, что разрешения установлены правильно. Потому что apache работает как никто (в большинстве случаев).

Я пробовал этот простой тест самостоятельно на ubuntu с php, установленным из репо.

test.java

 class test { public static void main(String[] args) { System.out.println("Hello World!"); } } 

test.php

 echo exec('java test'); 

Ran test.php

 $ php test.php Hello World! 

==

Или вы можете попробовать 1 из следующих решений (что было бы даже лучшим решением):

  1. Напишите свою Java-программу как веб-сервис, например, поверх атмосферы-spade-сервера (простая / встроенная банка). Это можно было бы написать безумно быстро. Но при высокой нагрузке это будет не лучший вариант, я думаю. Тем не менее, я думаю, что для вас это будет более чем достаточно быстро. Даже в этом случае это будет намного быстрее, чем выполнение этого, потому что у вас не будет накладной JVM. Может взорвать ваш сервер, не так быстро, как exec ()
  2. Сделайте блокировку pop / push из структуры списка redis (* nix). Это будет довольно легко писать на * nux, потому что есть клиентские библиотеки для java / php. Скорость будет лучше всего, я думаю, потому что redis написан на C. Я сам использую redis.
  3. Используйте JMS, например, activemq . Также довольно легко писать, потому что хорошая поддержка библиотеки. Я сам не использовал JMS. Я использую решение redis. Скорость, я думаю, будет немного меньше, чем решение redis.

Я не знаю, но я пришел на крест PHP-JAVA-моста, может быть, это может помочь

http://php-java-bridge.sourceforge.net/pjb/

Обновить:

Я тестировал это с отчетами Jasper, и он работает очень хорошо. Это позволит вам расширять Java-классы с помощью PHP или просто использовать класс Java, это был PHP.

 use java\lang\String as JString; require_once("javabridge/java/Java.inc"); class String extends JString { function toString () { return "hello " . parent::toString(); } } $str = new String("Java"); echo $str->toString(); 

или

 $temp = new Java('java.sql.Timestamp'); $javaObject = $temp->valueOf('2007-12-31 0:0:0'); $params = new Java("java.util.HashMap"); $params->put("text", "This is a test string"); $params->put("date",$javaObject); 

Дополнительные примеры: http://php-java-bridge.sourceforge.net/pjb/FAQ.html

Возможно, он имеет отношение к пути, по которому выполняется exec. Возможно, вам нужно будет явно определить свой путь к классам с абсолютным путем к вашим .class или jar-файлам при вызове java.

 <?php $PATH="C:\Program Files\Java\jdk1.7.0_09\bin"; echo exec("javac theNameOfYourJavaProgram.java 2>&1");//shows # of errors echo "<br />"; echo exec("java theNameOfYourJavaProgram 2>&1");//this line executes it echo "<br />"; echo shell_exec("javac theNameOfYourJavaProgram.java 2>&1 ");//compiles it ?>