LINUX.ORG.RU

Вызов метода Java-класса из PHP. Возможно ли?

 ,


0

2

Добрый вечер

Есть исходники класса на Java со всякими страшными вычислениями и подобной бинарщиной. И есть скрипт на PHP из которого ну очень нужно вызывать методы класса на Java.
Разбираться в исходниках класса на Java и переписывать совсем антивариант, код класса писался «для машины, а не человека».

Как вызвать одно из другого?

Спасибо


обернуть код на джаве написанным вручную на джаве веб-сервисом, и например рестом дергать нужные методы

stevejobs ★★★★☆
()
Ответ на: комментарий от BattleCoder

Код на Java это хитрое вычисление которое я нехочу реализовывать на PHP. У заказчика «свой бинарный протокол» блин

nyka
() автор топика
Ответ на: комментарий от stevejobs

Поясните плиз что рест

Для меня проще было бы написать что-то типа серверного приложения на на незнакомом мне Java и повесить его на локалхост. Когда надо произвести вычисление, php делает запрос мой локальный сервер написанный на Java и получает результат

nyka
() автор топика
Ответ на: комментарий от kiotoze

Exec исключен, потоки данных немалые и каждый пакет «распаковывается» вызовом метода, а вот бридж на PHP4 вроде тока, а у меня PHP5. поправьте если ошибаюсь про бридж

nyka
() автор топика
Ответ на: комментарий от nyka

Сделай простенькую программку на жаве, которая будет читать stdin, пакеты оттуда в любом формате, удобном для парсинга и писать вывод в stdout. На PHP соответственно делаешь exec, пишешь в stdin свои пакеты и читаешь результаты из stdout.

Legioner ★★★★★
()
Ответ на: комментарий от nyka

это оно и есть. Я обычно пишу сервисы на Spring, но не смог сейчас быстро нагуглить тебе какой-нибудь хороший туториал, как это делать.

гуглится только всякий шлак типа такого: http://habrahabr.ru/post/115718/ Помойму для новичка там совершенно ничего не понятно. НО в конце статьи есть исходники, можно попробовать скачать и запустить. Чтобы исходники заработали, нужно иметь как минимум Java и Apache Maven, и дальше уже разбираться. Основной плюс данной демки в том, что там всего 1 очень маленький файл исходника, и в нем реально быстро разобраться, а в большинстве других туториалов нужно нахерачить тонну кода.

помойму проще обратиться с данным вопросом к знакомому джава-программисту, он сможет написать обвязку очень быстро. А тебе, чтобы разобраться со всем этим, если НЕ повезет наткнуться на хороший туториал, придется затратить как минимум дни

гуглить стоит какой-нибудь туториал о том, как сделать веб-приложение с помощью сервлетов (гугли по слоу Servlet)

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 2)

Как вызвать одно из другого?

Прикрутить к жаба-исходникам какой-нибудь rpc. Возможно есть какие-то приблуды на жабке, чтобы автоматизировать процесс, я бы поискал что-нибудь в духе - суешь в него объект, а оно заворачивает его и выставляет наружу в виде soap.

скрипт на PHP

А что за скрипт. Может он на jphp взлетит?

no-such-file ★★★★★
()
Ответ на: комментарий от stevejobs

Да вот тоже думаю что надо Java'иста попросить какого-нибудь. На Java я могу читать, но не писать. Спасибо

nyka
() автор топика
Ответ на: комментарий от no-such-file

На хабре прочла статью о JPHP, посмотрела офсайт, а там куча терминов от которых я совсем далека.
Так же смотрела в сторону SWIG, но это не для моего случая

nyka
() автор топика
Ответ на: комментарий от no-such-file

Может он на jphp взлетит?

Тогда уж на Quercus :) И PHP полноценный, и Java-методы из него нативно вызываются.

KRoN73 ★★★★★
()
Ответ на: комментарий от nyka

Всё равно всё ещё непонятно. Когда вам это вычисление нужно вызвать, и как? Тут все подряд советуют рест, но я на 100% не уверен, это именно то, что вам подойдёт (хотя есть догадка).

Можно в двух словах описать архитектуру вашего PHP-приложения и Java-приложения, которое вам нужно использовать? Вариантов тут масса, и самый удобный зависит от конкретной задачи.

BattleCoder ★★★★★
()
Ответ на: комментарий от nyka

Пиши на Java.
Язык простой, везде ООП, IDE выполняет за тебя большую часть работы, документации и гайдов немеренно; повышаешь скилл программирования, заодно обходишь все костыли между взаимодействием Java с PHP

I60R ★★
()
Ответ на: комментарий от BattleCoder

Архитектура в общих чертах:
1) на сокет приходит пакет данных (запросом)
2) пакет распаковывается с пом хитрого приобразования реализованного в Java-классе (unpack)
3) распакованные данные обрабатываются и формируется ответ
4) ответ запаковывается другим хитрым методом из Java-класса(pack)
5) запакованные данные пишутся в сокет (ответ)

Эта «запаковка» - костыль 100-летней давности и вообще пример «сикьюрити через обскурити».
PHP-cкрипт в котором бы хотелось распаковывать данные-консольный.

Как мне кажется, обернуть Java-класс в простой сервер и при старте PHP-скрипта создавать с ним соединение. Далее в течение работы для распаковки данных просто слать пакеты на распаковку Java-серверу. С моими минимальными знаниями в Java только что провела эксперимент: 10.000 пакетов метод расшифровывает в секунду, так что проблем с временем распаковки быть не должно

nyka
() автор топика
Ответ на: комментарий от BattleCoder

он задизасемблил код какогото сервлета платного на пару мегабайт

и желает прикрутить к какойто невыполненой работе по фрилансу...типикал

anonymous
()

и да он не осилит сокеты или еще более банальные реализации вплоть до прямого иксекушена из пхп...

осилилбы не задавалбы таких вопросов,он не знает вообще с чего начинать,и только вы можете написать за него-типикал б-дло-кодер

anonymous
()
Ответ на: комментарий от anonymous

во-первых я девушка, а не «он»
во-вторых я ничего не «задизасембила»
в-третьих я не фрилансер

Если вы не в кусе, я указала что нехочется перелопачивать код. Для человека который хоть чуть-чуть вник в суть вопроса, сразу же появляется множество проблем при портировании, начиная от размерности базовых типов данных(LONG в PHP нет, хотя можно обойти это c пом PHP_64x) и заканчивая еще Бог знает чем.

я так поняла что вам посуществу сказать нечего, тогда не пишите пожалуйста

nyka
() автор топика
Ответ на: комментарий от nyka

портировал бинарный си код с указателями и использованием сдвигов во всем коде(тыщи строк) для вычислений и без перерасчета вручную(не я автор оригинала)-фиг пойми что оно делает...переводил все в java и потом в php(и то и то работало) за 3 дня оба порта были готовы

ваша задача тривиальна-чтото на уровне:
-как установить линукс
-возьми и установи....но нет ты не поймешь пока ктото не покажет

тут также-задача уровня «чуть выше бегинера» который хоть раз делал чтото на джава и пхп...я дольше пишу этот пост чем могбы решить задачу

иди на фриланс там за сутки рабочего времени тебе сделают

и да феменизм/матриархат не пройдет,иди в свой детский сад в реале играй «я жи...блаблабла»-просто иди на-уй

anonymous
()
Ответ на: комментарий от anonymous

какой вы грубиян... продолжайте))
У меня 2400 строк кода со всякого рода сдвигами и итп...
Я в действительности не могу понять что делает этот код, не на какие известные операции это не похоже. Думала что ASN.1 - нифига.
С линуксом у меня все нормально, админю пару серверов, кроме того это моя десктопная рабочая среда
На C/С++ переписала бы, там посути 1-в-1 пиши, но на не PHP. Однобайтового типа данных нет, лонга нет (на 32х)...

Я согласна с людьми которые посоветовали мне обернуть класс в сервис

nyka
() автор топика
Ответ на: комментарий от nyka

Не-не, слишком сложно.

Лучше написать простенький аля-helloworld на java, упаковать в jar и вызывать его из php через exec. Пусть считывает что-то из stdin, записывает в stdout. Проще не придумать.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Это отличное решение, но не для моего приложения. Слишком часто придется дергать exec. В штатном режиме через приложение проходит порядка 70 КБ. Пакеты данных одного и того же размера примерно по 3 КБ, т.е. это не менее 20 экзеков в секунду, и непонятно как это отразится... Это же не просто нативный exec кода, а exec вирт машины java с кодом для выполнения
А вообще попробую сегодня, уже ради интереса))

nyka
() автор топика
Ответ на: комментарий от nyka

Ну да, java машина вещь тяжёлая, лучше её один раз запустить и потом дёргать, а не постоянно холодный старт вызывать.

Есть ещё вариант - если это под Linux, можно запустить JVM один раз, и данные передавать либо через pipe, либо через unix socket, в конце концов TCP socket (последний вариант самый медленный по логике вещей). Это если всё в пределах одной машины.

REST и прочие HTTP имеет смысл использовать, если хочется разнести это по разным машинам. Но тогда я вообще не понимаю, зачем вам PHP, можно же всё на Java делать ;)

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Да, в пределах одной машины и под Linux. Попросила Java-программиста написать сервер с комуникациями на unix_socket.
Я с Java не работала, а на php для меня писать проще простого.
Сегодня пробовала на сервере средней конфигуриции запускать exec-ом, машина просто колом становится при штатном трафике

nyka
() автор топика
Ответ на: комментарий от stevejobs

Если автор совсем не может в джаву, более простым вариантом будет поднять локальный контейнер, взять Eclipse для JEE и заюзать мастер создания сервлетов, ну а те десять строк логики как-то самому осилить придется. Собственно, контейнер в нем же можно и сконфигурировать.

Mahmood
()
10 марта 2016 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.