Ошибка разрешения PHP JavaBridge - PullRequest
3 голосов
/ 22 ноября 2011

У меня есть существующее большое (ish) PHP веб-приложение (использующее Apache и MySQL), которое теперь должно иметь возможность вызывать механизм отчетов на основе Java. Поэтому я пытаюсь получить доступ к классам Java из существующего приложения PHP.

Пока что на новом сервере разработчика я успешно установил проект PHP-Javabridge с открытым исходным кодом (http://php -java-bridge.sourceforge.net / pjb / index.php) и запустил его под управлением Tomcat (7.0). .22) на коробке Fedora 15 с портом 8080. Я не могу использовать Zend Javabridge из-за ограничений хостинга для работающей системы, и, к сожалению, в настоящее время смена провайдера не является опцией.

У меня также есть Apache и PHP, работающие на устройстве dev с использованием порта 80.

Я могу получить доступ к веб-приложению JavaBridge в Tomcat, и все примеры PHP работают нормально. Тем не менее, я столкнулся с проблемой при попытке получить доступ к JavaBridge из моего существующего приложения.

Я предполагаю, что я мог бы вызвать функцию php 'java' из скрипта, расположенного в корне сети для Apache (/var/www/html).

Я использовал скрипт, поставляемый в приложении JavaBridge, следующим образом:

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

Это приводит к следующим ошибкам в / etc / httpd / logs / error_log

[Вт Ноя 22 15:01:08 2011] [error] [client :: 1] Предупреждение PHP: require_once (http://localhost:8080/JavaBridge/java/Java.inc): не удалось открыть поток: в /var/www/html/javatest.php отказано в разрешении строка 2

[Вт Ноя 22 15:01:08 2011] [error] [client :: 1] Неустранимая ошибка PHP: require_once (): сбой при открытии необходим 'http://localhost:8080/JavaBridge/java/Java.inc' (include_path ='.: / Php / includes: / usr / share / apache-tomcat-7.0.22 / webapps / JavaBridge ') в /var/www/html/javatest.php в строке 2

Другой предлагаемый скрипт: (примечание: у меня есть копия Java.inc в / var / www / html)

<?php
    define("JAVA_HOSTS", "127.0.0.1:8080");
    define("JAVA_SERVLET", "/JavaBridge/servlet.phpjavabridge");
    require_once("./Java.inc");
    echo java("java.lang.System")->getProperties();
?>

Это приводит к следующим ошибкам:

[Вторник, 22 ноября 12:57:51 2011] [ошибка] [клиент :: 1] Предупреждение PHP: fsockopen (): невозможно подключиться к 127.0.0.1:8080 (доступ запрещен) в / usr / share / apache -tomcat-7.0.22 / webapps / JavaBridge / java / Java.inc в строке 994

[Вт ноя 22, 12:57:51 2011] [ошибка] [клиент :: 1] Неустранимая ошибка PHP: Uncaught Не удалось подключиться к серверу JEE 127.0.0.1:8080. Пожалуйста, начните это. Сообщение об ошибке: «Отказано в доступе» (13) \ n \ n в строке /usr/share/apache-tomcat-7.0.22/webapps/JavaBridge/java/Java.inc в строке 989

Шаги, которые я предпринял для исключения проблем:

  • Выключил брандмауэр на сервере
  • Chmod'd все до 777
  • Проверено, что Tomcat работает до и после запуска сценария PHP (я предполагаю, возможно, ошибочно, что Tomcat - это сервер JEE, упомянутый во втором сообщении об ошибке?) 4). В ini-файле PHP нет ограничений open_basedir, безопасный режим не включен, а параметры allow_furl_open и allow_url_include

Я действительно застрял на этом. Никакое количество Google не находит подобной специфической проблемы.

Я должен сказать, что я очень незнаком с Java и, возможно, получил неправильный конец флешки на JavaBridge, поскольку просто невозможно запустить функцию java из местоположения /var/www/html и что любой PHP-скрипты должны запускаться из приложения Tomcat JavaBridge.

Я предполагаю, что все сервлеты работают, но мое отсутствие знаний означает, что я не знаю, чтобы это проверить.

Поскольку это происходит в Fedora, может ли оно быть связано с проблемой разрешений SELinux?

Ответы [ 4 ]

3 голосов
/ 23 ноября 2011

Narcissus - большое спасибо за ваш вклад, но выяснилось, что проблема с правами доступа в SELinux не позволяла PHP выполнить вызов JavaBridge.

Я временно решил проблему, отключив SELinux, введя в качестве пользователя root следующую команду:

setenforce 0

Мне нужно найти более приемлемое долгосрочное решение для изменения разрешений SELinux, чтобы обеспечить взаимодействие между PHP и Javabridge, но это другая проблема ...

2 голосов
/ 17 сентября 2012

Вы добавили этот код в свой php.ini?

allow_url_include = On
0 голосов
/ 28 октября 2014

Для того, чтобы дать другим дополнительную возможность устранения неполадок, которая наткнулась на это - это сработало для меня:

sudo setsebool -P httpd_can_network_connect_db=1

Это позволяет SELinux разрешить apache подключаться к вашей базе данных.Я получаю сообщения об ошибках вроде этого:

httpd журнал ошибок:

java.sql.SQLNonTransientConnectionException: .... Отказано в доступе.Вызвано: java.net.SocketException: в доступе отказано

0 голосов
/ 22 ноября 2011

У меня тоже были проблемы с PHP Java Bridge при настройке.Однако, глядя в мои настройки, я вижу, что JAVA_HOSTS определен как 127.0.0.1:8087.

Если ваш браузер может что-то видеть на этом порту, но мостовое соединение все еще не работает, он можетбудь то, что приложение для прослушивания не слушает правильно.

Если вы зайдете на php-java-bridge.sourceforge.net/pjb/desktop-apps.php и выполните жирные разделы кода в разделе «Добавить PHP»/ Библиотека Java Bridge в ваше приложение Java 'вы можете видеть, что вам нужно:

  • добавить файл JavaBridge.jar в ваш проект
  • добавить public static final String JAVABRIDGE_PORT="8087"; в ваш класс
  • добавьте static final php.java.bridge.JavaBridgeRunner runner = php.java.bridge.JavaBridgeRunner.getInstance(JAVABRIDGE_PORT); к своему классу
  • в своей основной функции, вызовите runner.waitFor();

Это в основном настроит ваше приложение на прослушивание.

...