Подключите код PHP к бэкэнду Java - PullRequest
7 голосов
/ 21 мая 2009

Я реализую веб-сайт, используя PHP для внешнего интерфейса и Java-сервис в качестве внутреннего. Две части следующие:

  1. PHP-интерфейс слушает http-запросы и взаимодействует с базой данных.

  2. Серверная часть Java работает непрерывно и отвечает на вызовы из интерфейса.

В частности, серверная часть - это демон, который соединяет и поддерживает связь с несколькими службами обмена мгновенными сообщениями (AOL, MSN, Yahoo, Jabber ...).

Оба уровня будут развернуты в одной и той же системе (я полагаю, в CentOS-боксе), и введение промежуточного уровня (например: использование XML-RPC) снизит производительность (ресурс также довольно ограничен).

Вопрос: есть ли способ связать два слоя напрямую? (между ними больше нет веб-служб)

Ответы [ 9 ]

9 голосов
/ 21 мая 2009

Поскольку это связь между двумя отдельными запущенными процессами, «прямой» вызов (как в JNI ) невозможен. Самый простой способ сделать такое межпроцессное взаимодействие - это, вероятно, именованные каналы и сетевые сокеты. В обоих случаях вам придется определить протокол связи и реализовать его с обеих сторон. Использование стандартного протокола, такого как XML-RPC, делает это проще, но не является строго необходимым.

4 голосов
/ 21 мая 2009

Обычно существует четыре шаблона для интеграции приложений:

  1. через файловую систему, т.е. один производитель записывает данные в каталог, отслеживаемый потребителем
  2. через базу данных, т.е. два приложения совместно используют схему или таблицу и используют ее для обмена данными
  3. через RMI / RPC / веб-сервис / любую блокировку, синхронизировать вызов из одного приложения в другое. Для PHP в Java вы можете выбирать из различных библиотек интеграции, перечисленных выше, или использовать некоторые стандарты веб-сервисов, такие как SOAP.
  4. через обмен сообщениями / любые неблокирующие, асинхронные операции, когда одно приложение отправляет сообщение другому приложению.

У каждого из этих паттернов есть свои плюсы и минусы, но хорошее эмпирическое правило - выбрать тот, у которого самая слабая связь, с которой вы можете избежать неприятностей. Например, если вы выбрали # 4, ваше Java-приложение может аварийно завершить работу, не отключив и PHP-приложение.

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

3 голосов
/ 21 мая 2009

Я пробовал мост PHP-Java (php-java-bridge.sourceforge.net/pjb/), и он работает довольно хорошо. По сути, нам нужно запустить файл jar (JavaBridge.jar), который прослушивает порт (есть несколько вариантов, таких как локальный сокет, порт 8080 и т. Д.). Ваши файлы классов Java должны быть доступны для JavaBridge в пути к классам. Вам нужно включить файл Java.inc в ваш php, и вы можете получить доступ к классам Java.

2 голосов
/ 21 мая 2009

Конечно, есть много способов, но вы сказали об ограниченном ресурсе ...

ИМХО определите свой собственный легкий RPC-подобный протокол и используйте сокеты на TCP / IP для связи. На самом деле в этом случае нет необходимости использовать все преимущества RPC и т. Д. Вам нужно только определить API для этого конкретного случая и реализовать его с обеих сторон. В этом случае вы можете сериализовать ваши пакеты до довольно маленьких. Вы даже можете назначить вид GUID своим удаленным методам и использовать их для экономии трафика и ускорения вашего общения.

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

1 голос
/ 30 октября 2009

Я тоже недавно столкнулся с этой проблемой. Решение Resin, описанное выше, на самом деле является полной перепиской PHP на Java в духе JRuby, Jython и Rhino. Это называется Quercus. Но я думаю, для вас, как и для меня, отказ от настройки Apache / PHP на самом деле не вариант.

Кроме того, есть и другие проблемы с Quercus: бесплатная версия - GPL, что сложно, если вы разрабатываете коммерческое программное обеспечение (хотя и не так сложно, как хотелось бы, чтобы Resin поверил (но IANAL)), и к тому же бесплатная версия не поддерживает компиляцию в байт-код, поэтому в основном это интерпретатор, написанный на Java.

В итоге я решил просто обмениваться простыми сообщениями по HTTP. Я использовал PHP json_encode() / json_decode() и Java json-lib для кодирования сообщений в формате JSON (простое, на основе текста, хорошее соответствие для модели данных).

Другим интересным и легким вариантом было бы создание Java-кода PHP, а затем использование PHP-директивы include () для извлечения этого по HTTP и его выполнения. Я не пробовал это все же.

Если вы беспокоитесь о реальных HTTP-вызовах (для повышения производительности), то ни одно из этих решений не поможет. Все, что я могу сказать, это то, что у меня не было проблем с PHP и Java в одной локальной сети. Мне кажется, что это не будет проблемой для подавляющего большинства приложений, если вы сохраняете свои RPC-вызовы достаточно подробными (что вы действительно должны делать в любом случае).

1 голос
/ 21 мая 2009

Вы можете попробовать интеграцию PHP / Java .

Кроме того, если связь является односторонней (что-то вроде «sendmail for IM»), вы можете записывать запросы PHP в файл и отслеживать их в своем приложении Java.

0 голосов
/ 21 мая 2009

Почему бы не использовать веб-сервис?

Создайте слой Java и установите доступ ws (Axis, SpringWS и т. Д.), А Php - доступ к слою Java с помощью одного клиента ws.

Я думаю, что это просто и полезно.

0 голосов
/ 21 мая 2009

Извините, это небольшой ответ, но: я слышал, что сервер приложений Resin поддерживает интеграцию Java и PHP.

Они утверждают, что могут разбить php и java вместе: http://www.caucho.com/resin-3.0/quercus/

Я использовал смолу для обслуживания приложений J2ee, но не для поддержки PHP.

Мне было бы интересно услышать о таких приключениях.

0 голосов
/ 21 мая 2009

Я наткнулся на эту страницу, которая представляет средство для связи двух слоев. Тем не менее, он все еще требует среднего уровня (TCP / IP). Более того, другие сервисы также могут использовать сервис Java, потому что он принимает все входящие соединения.

http://www.devx.com/Java/Article/20509

[исследующий ...]

...