О том, как подружить Java и Php

В интернете в 2004 году вызвал большой ажиотаж пост о том, как из php-скриптов оказывается можно легко запускать java-приложения (http://forum.vingrad.ru/topic-38347.html). К сожалению, с тех пор прошло много времени и простого подключения php_java.dll библиотеки для этого уже не достаточно, и приходится разбираться со всем заново.

Основной мануал по настройке взаимодействия php и java здесь: http://php-java-bridge.sourceforge.net/pjb/installation.php
В нём довольно много вольностей, к тому же бусурманский язык не добавляет ясности всем происходящему, поэтому я продублирую тут всё на русском.

Сначала описываю, как соединить php и java на винде на локалхосте, затем как это же сделать на Linux хостинге (CentOS)

Для Windows:

Скачиваем ява-скрипты php-java-bridge отсюда: http://php-java-bridge.sourceforge.net/pjb/download.php
(бинарники и документацию). Документацию разархивируем.

Я подразумеваю, что у нас уже установлен JDK, если нет, качаем и устанавливаем его отсюда:
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1...

Открываем консоль, заходим в папку, куда мы скачали все документы, запускаем код
java -classpath JavaBridge.war TestInstallation

должен сгенерировать файл readme.html, в котором просто вывод phpinfo().

Устанавливаем сервис Apache Tomcat, который запускает службу по порту 8080 и позволяет запускать java скрипты через обращение к этому порту. скачать его здесь http://tomcat.apache.org/download-80.cgi (скачивать бинарный winn32/64 installer)
как установить можно почитать здесь http://www.javaportal.ru/articles/install_Apache_Tomcat.html

После установки открываем http://127.0.0.1:8080/
если там красивая страница томКата, то всё нормально. Если там список java файлов, значит вам надо перезагрузиться и запустить томкат снова. Если там ничего нет, значит что-то пошло не так, у вас не запустился томкат.

Дальше нам нужно залить в него библиотеку JavaBridge.war.
Сначала останавливаем томкат и заходим в настройки здесь: c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\manager\WEB-INF\web.xml
Открываем его и ищем там строчку

    <multipart-config>
      <!-- 50MB max -->
      <max-file-size>52428800</max-file-size>
      <max-request-size>52428800</max-request-size>
      <file-size-threshold>0</file-size-threshold>
    </multipart-config>

Ставим там большее значение (я поставил 152428800 вместо 52428800, т.е. стало 150 Мб)
сохраняем, запускаем томкат снова.

Заходим в админку томката http://127.0.0.1:8080/manager/html
если спрашивает логин с паролем, вводите те, которые вы вводили при установке томката.
Там внизу есть форма для загрузки файла и кнопка deploy.
Выбираем файл JavaBridge.war, который у нас скачался вместе с документацией к пхп-ява-бриджу. Загружаем.
Теперь заходим по ссылке http://localhost:8080/JavaBridge/java/Java.inc, должен открыться обычный ява-код. Если это так, всё правильно, идем дальше.

В настройках вашего php.ini удостоверьтесь, что там включен параметр allow_url_include = On (если у вас денвер, файл лежит в Denwer\usr\local\php5)

Пишем простейший тестовый код:

<?php
require_once("http://localhost:8080/JavaBridge/java/Java.inc"); 
echo java("java.lang.System")->getProperties(); 
?>

сохраняем с расширением .php куда-нибудь в доступности Денвера или вашего веб-сервера. Обращаемся к нему из браузера, должны получить информацию о ява переменных на нашем сервере (без всяких фатал ошибок)

Теперь нам надо подключить код, который мы написали на ява, к пхп-коду, из пхп запустить класс ява кода и получить результат, вывести его на web-страницу.

Для этого сначала пишем какой-нибудь простейший проект на ява (я использую eclipse ide под windows):

package Excel;
public class MainClass {
public static void main(String[] args) {
		System.out.println("Hello World!");
}
public String sumString(double x, double y)
{
  double addsum = x + y;
  String str = "Sum is  " + addsum;
  return str;
}
}

Компилируем этот проект как .jar-файл (File->Export..., в поиске пишем jar, выбираем галочкой проект, "ок").
Теперь копируем получившийся .jar-файл в папку c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\JavaBridge\WEB-INF\lib\
Перезапускаем томкат (рядом с часами в винде есть иконка Tomkat manager, в нем кнопки "Stop" и "Start")

Создаем пхп-скрипт примерно такого содержания

<?php
require_once("http://localhost:8080/JavaBridge/java/Java.inc"); 
$myclass = new java("Excel.MainClass");
echo $myclass->sumString(0.01, 0.03);
?>

Запускаем скрипт любым способом (я через денвер), любуемся на результат: Sum is 0.04. Ура! :)

Обратите внимание, что после каждого обновления вашего .jar файла в папке WEB-INF\lib, томкат нужно перезагружать, чтобы изменения применились.

Полезная дополнительная инфа: http://php-java-bridge.sourceforge.net/pjb/FAQ.html
Полезная расширенная инфа о добавлении своих .jar-файлов была найдена здесь http://www.developer.com/java/other/php-with-java-using-php-java-bridge-...

Примеры кода работы с библиотекой apache poi (на ява и то же самое на php через php-java-bridge):
На ява:

package Excel;
 
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
 
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.WorkbookFactory; // This is included in poi-ooxml-3.6-20091214.jar
import org.apache.poi.ss.usermodel.Workbook;
 
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 
 
public class MainClass {
 
	public static void main(String[] args) {
		//String out = this.ChangeXlsFile("111.xls");
	}
 
	  public String sumString(double x, double y)
	  {
		  return System.getProperty("user.dir");
		  /*
	    double addsum = x + y;
	    String str = "Sum is  " + addsum;
	    return str;
	    */
	  }
 
	  public String ChangeXlsFile(String filepath, String character) {
 
		  long startTime = System.currentTimeMillis();
 
		    try
		    {
		      // Read from original Excel file.
		      Workbook workbook = WorkbookFactory.create(new FileInputStream(filepath) );
 
		      // Get the first sheet.
		      //Sheet sheet = workbook.getSheet("стр.2");//
		      Sheet sheet = workbook.getSheetAt(0);
 
		      // Set value of the first cell.
 
		      Row row = sheet.getRow(15);
		      Cell cell = row.getCell(3);
		      cell.setCellValue(character);
		      workbook.setSheetName(0, "Это щииит 1");
 
		      workbook.cloneSheet(0);
 
		      workbook.setSheetName(workbook.getNumberOfSheets() - 1, "Это щииит 2 маза фака!");
 
		      // Write newly modified workbook to a file.
		      FileOutputStream fileOut = new FileOutputStream("new_workbook.xls");
		      workbook.write(fileOut);
		      fileOut.close();
		    }
		    catch(FileNotFoundException e)
		    {
		    	return e.toString();
		    }
		    catch(IOException e)
		    {
		    	return e.toString();
		    }
		    catch(InvalidFormatException e)
		    {
		    	return e.toString();
		    }
 
			long endTime = System.currentTimeMillis();
 
			System.out.println("That took " + (endTime - startTime) + " milliseconds");
 
			return "That took " + (endTime - startTime) + " milliseconds";
 
	  }
}

На php:

require_once("http://localhost:8080/JavaBridge/java/Java.inc"); 
header('Content-Type: text/html; charset=utf-8');
 
$myclass = new java("Excel.MainClass");
echo $myclass->sumString(0.01, 0.03);
echo '<br/>';
echo $myclass->ChangeXlsFile("111.xls", "K");
echo '<br/>';
 
function timeMeasure()
{
    list($msec, $sec) = explode(chr(32), microtime());
    return ($sec+$msec);
}
 
$start = timeMeasure();
 
//То же самое, только на php
$file = new java("java.io.FileInputStream", "111.xls");
$workbook = java("org.apache.poi.ss.usermodel.WorkbookFactory")->create($file);
 
$sheet = $workbook->getSheetAt(0);
 
// Set value of the first cell.
$row = $sheet->getRow(15);
$cell = $row->getCell(3);
$cell->setCellValue('Ы');
$workbook->setSheetName(0, "Это щииит 1");
 
$workbook->cloneSheet(0);
 
$workbook->setSheetName($workbook->getNumberOfSheets() - 1, "Это щииит 2 маза фака!");
 
// Write newly modified workbook to a file.
$fileOut = new java("java.io.FileOutputStream", "new_workbook.xls");
$workbook->write($fileOut);
$fileOut->close();
 
echo '<br/>' . round(timeMeasure()-$start, 6) . ' sec : php script end.';

Для их работоспособности в папку c:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\JavaBridge\WEB-INF\lib\ надо залить последние версии библиотек apache poi.jar и poi-ooxml.jar, а так же положить в корневую папку c:\Program Files\Apache Software Foundation\Tomcat 7.0\ два указанных в коде xls файла. Но вообще код здесь приведен как пример соответсвия php-кода ява-коду.

Для Linux:

Теперь нам надо всё это дело настроить на linux-машине (у нас используется apache aws на базе Centos 6).
Заходим по ssh, устанавливаем яву:
yum install java-1.6.* -y
устанавливаем tomcat:
sudo yum install tomcat6

Если надо поменять порт, на котором висит tomcat, то надо изменить два файла: /etc/tomcat6/tomcat6.conf и /etc/tomcat6/server.xml

Дальнейшая настройка по этому мануалу:
http://www.excelsior-usa.com/articles/tomcat-amazon-ec2-basic.html

В файл /etc/tomcat6/tomcat-users.xml надо в секцию томкат-юзерс добавить или расскоментировать строчку:

<tomcat-users>
<user username="admin" password="admin" roles="admin,manager"/>
</tomcat-users>

Открываем как обычно http://ваш_адрес:8088/manager/html, вводим этот логин и пароль (который в файле выше прописали), попадаем в админку. Там заливаем JavaBridge.war как я описывал выше для виндоус.

Снова проверяем: http://ваш_адрес:8080/JavaBridge/java/Java.inc должен открываться.

Создаем пхп-скрипт примерно такого содержания

<?php
require_once("http://ваш_хост:8080/JavaBridge/java/Java.inc"); 
$myclass = new java("Excel.MainClass");
echo $myclass->sumString(0.01, 0.03);
?>

Не забудьте nano /etc/php.ini заменить allow_url_include на On и service php-fpm restart.

Заливаем на сервак вместе с компиленным MainClass.jar, место добавление всех .jar библиотек при использовании Томкат должно быть /usr/share/tomcat6/webapps/JavaBridge/WEB-INF/lib

Удачи!

Comments

Алексей 03.05.2018 - 11:15

Здравствуйте. Статья старая, как Вы сейчас оцениваете саму идею дружить php и java&

Дмитрий 07.02.2019 - 19:33

Статья очень помогла. Спасибо) Правда для новичков хотелось бы более детально некоторые моменты описать. По возможности выложите её на более популярных ресурхах)

Add new comment