Статьи

PHP на сервере приложений Java

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

Очень реалистичным примером может служить интеграция приложений Java и PHP: с помощью Resin’s Caucho вы можете фактически запускать код Java и PHP в одном и том же сценарии. Например, вы можете взять библиотеку, доступную только для одного из двух языков, и использовать ее на другой стороне, не прибегая к различным процессам, которые взаимодействуют.

Решение, которое было предложено моей команде для запуска кода PHP в среде Java, — это Quercus , модуль для сервера приложений Resin .

Привет мир

Resin — это сервер приложений, который поставляется в комплекте с веб-интерфейсом. Мы загрузили последнюю версию 4.x и поместили в папку веб-приложения ROOT файл WEB-INF / смолы-web.xml для настройки.

Предлагаемое поведение по умолчанию — пересылать любой запрос, заканчивающийся на .php, интерпретатору , но совпадение может быть просто *, если вам нужно только обслуживать файлы PHP.

Примечание для PHPers: сервлеты примерно эквивалентны контроллерам действий в наших средах MVC. Каждый запрос на файл PHP перехватывается сервлетом, поставляемым в Quercus, который может прочитать полный запрос и открыть файл для выполнения.

Пример Hello World действительно работает после нескольких секунд настройки. Замечательно, учитывая сложность перевода языка на другой.

Давайте попробуем наш набор тестов …

Поскольку у PHP нет языковой спецификации, а есть только одна реализация, нет гарантии, что ядра PHP будут идентичны по поведению Quercus.

Мы должны были быть уверены, что ничего не сломалось, запустив набор тестов приложения, чтобы убедиться, что в поведении array_search () или предельного размера запроса в PDO нет каких-либо угловых случаев или любого другого отклонения от официального интерпретатора PHP.

К счастью, Quercus не только запускает код PHP через свой сервлет, но и через командную строку:

java -cp resin.jar script.php

Мы можем использовать эту команду для запуска PHPUnit. В конце концов, / usr / bin / phpunit всегда ссылается на файл PHP:

java -cp resin.jar /usr/bin/phpunit

По умолчанию include_path был .: / Usr / share / php , который в точности совпадает с нашим include_path в Ubuntu. Так что нет проблем с включением файлов PHPUnit или других вещей PEAR.

Вот и проблемы

Однако мы обнаружили, что некоторые классы реализованы в пользовательском пространстве (с использованием PHP-кода, а не скомпилированного Java-кода). Например, FilterIterator — это класс, поставляемый ядром PHP, но добавленный Quercus в виде файла .php. Этот вид реализации может повлиять на производительность, если ваш код сильно зависит от структур данных SPL.

Более того, по крайней мере FilterIterator не был доступен в cli-версии . Это можно исправить, запустив пару class_exists () через веб-интерфейс, и он найдет файлы. Чтобы продолжить эксперимент, мы даже попытались запустить PHPUnit в браузере с отчетом теста PHPUnit Мэтта Мюллера . Мы загрузили пакет и поместили его в корневой каталог документа, чтобы обнаружить, что …

Некоторые занятия отсутствуют

Некоторые классы действительно отсутствуют: RecursiveDirectoryIterator , часть Стандартной библиотеки PHP и зависимость Doctrine 2 и Zend Framework, не реализован .

Мы обнаружили, что есть ветвь Quercus, поддерживаемая CleverCloud, которая поддерживает больше классов и имеет открытый билет, признающий необходимость завершения реализации SPL. На этот раз реализации являются чистой Java. К сожалению, RecursiveDirectoryIterator отсутствует в соответствующей ветке .

Мы написали в отдел продаж, чтобы узнать, имеет ли профессиональная версия лучшую поддержку, но, вероятно, она будет сосредоточена на нефункциональных требованиях, таких как производительность.

Выводы

Resin — это известный и надежный сервер приложений для приложений Java. Однако многие известные отзывы, такие как salesforce.com, основаны на технологиях Java, а не на его поддержке PHP.

Вы можете легко интегрировать Java и некоторые новые строки PHP-кода с Quercus: установка действительно проста. Но не думайте, что вы сможете без проблем запустить существующее PHP-приложение на Resin из коробки : нам не удалось запустить PHPUnit или приложение, основанное на Doctrine2, из-за отсутствующих реализаций. Это текущее состояние Quercus, но мы надеемся, что поддержка улучшится, чтобы предоставить разработчикам PHP еще один вариант.