Использование appserver.io SessionBean в простом PHP-скрипте

Я ищу способ заменить выбранную функциональность в существующем приложении на appserver.io SessionBeans, но мне не удается найти пример того, как получить доступ к SessionBean в простом классе php.

У меня есть супер простой Singleton SessionBean из примеров:

<?php

namespace MyVendor\MyApp;

/**
* @Singleton(name="MySingletonBean")
*/
class MySingletonBean extends \Stackable
{
protected $counter = 0;

public function raiseMe()
{
return $this->counter++;
}
}

Реализация внутри сервлета довольно проста и работает как шарм, но я не могу найти документацию по получению доступа к нему в простом php-файле за пределами сервлета.

Я ожидаю, что это будет довольно просто, как:

<?php

use MyVendor\MyApp\MySingletonBean;

class IndexController extends App
{
/**
* maybe some funky annotations...
*
* @var \MyVendor\MyApp\MySingletonBean
* @EnterpriseBean(name="MySingletonBean")
*/
protected $mySingletonBean;

public function index() {

// and then servlet style...
echo $this->mySingletonBean->raiseMe();

// ... or like this?
echo MySingletonBean::getInstance()->raiseMe();
}
}

Может кто-нибудь, пожалуйста, укажите мне правильное направление?

Спасибо,

Питер

1

Решение

Поскольку SessionBeans существует в виде реальных объектов PHP внутри контейнера, доступ к ним из e невозможен. г. приложение PHP-FPM. Для этого мы реализовали клиент, который возвращает прокси-компонент к сессионному компоненту и позволяет вам выполнять его методы. Дополнительно необходимо настроить сам контейнер постоянства, потому что по умолчанию мы отключили удаленные соединения по соображениям безопасности.

Итак, первое, что вы должны сделать, это установить appserver-io/rmi пакет как требование Composer в вашем проекте, e. г.

$ composer install appserver-io/rmi

после этого вы должны настроить сервер, который разрешает удаленный доступ к контейнеру постоянства, e. г. Вы можете добавить следующий фрагмент XML в <container name="combined-appserver"> в etc/appserver/appserver.xml файл

<server
name="persistence-container"type="\AppserverIo\Server\Servers\MultiThreadedServer"worker="\AppserverIo\Server\Workers\ThreadWorker"socket="\AppserverIo\Server\Sockets\StreamSocket"requestContext="\AppserverIo\Server\Contexts\RequestContext"serverContext="\AppserverIo\Appserver\Server\Contexts\StandardServerContext"streamContext="\AppserverIo\Server\Contexts\StreamContext"loggerName="System">

<params>
<param name="admin" type="string">info@appserver.io</param>
<param name="transport" type="string">tcp</param>
<param name="address" type="string">127.0.0.1</param>
<param name="port" type="integer">8585</param>
<param name="workerNumber" type="integer">4</param>
<param name="workerAcceptMin" type="integer">3</param>
<param name="workerAcceptMax" type="integer">8</param>
<param name="documentRoot" type="string">webapps</param>
<param name="directoryIndex" type="string">index.pc</param>
<param name="keepAliveMax" type="integer">64</param>
<param name="keepAliveTimeout" type="integer">5</param>
<param name="errorsPageTemplatePath" type="string">resources/templates/www/error.phtml</param>
</params>

<environmentVariables>
<environmentVariable condition="" definition="LOGGER_ACCESS=Access" />
</environmentVariables>

<connectionHandlers>
<connectionHandler type="\AppserverIo\WebServer\ConnectionHandlers\HttpConnectionHandler" />
<!-- connectionHandler type="\AppserverIo\Appserver\MessageQueue\ConnectionHandlers\AmqpConnectionHandler" / -->
</connectionHandlers>

<accesses>
<!-- per default allow everything -->
<access type="allow">
<params>
<param name="X_REQUEST_URI" type="string">.*</param>
</params>
</access>
</accesses>

<modules>
<!-- REQUEST_POST hook -->
<module type="\AppserverIo\WebServer\Modules\AuthenticationModule"/>
<module type="\AppserverIo\WebServer\Modules\VirtualHostModule"/>
<module type="\AppserverIo\WebServer\Modules\EnvironmentVariableModule" />
<module type="\AppserverIo\WebServer\Modules\RewriteModule"/>
<module type="\AppserverIo\WebServer\Modules\DirectoryModule"/>
<module type="\AppserverIo\WebServer\Modules\AccessModule"/>
<module type="\AppserverIo\WebServer\Modules\CoreModule"/>
<module type="\AppserverIo\Appserver\PersistenceContainer\PersistenceContainerModule" />
<!-- RESPONSE_PRE hook -->
<module type="\AppserverIo\WebServer\Modules\DeflateModule"/>
<!-- RESPONSE_POST hook -->
<!-- module type="\AppserverIo\Appserver\Core\Modules\ProfileModule"/ -->
</modules>

<fileHandlers>
<fileHandler name="persistence-container" extension=".pc" />
</fileHandlers>

</server>

ниже message-queue Конфигурация сервера.

Наконец, вы можете подключиться к постоянному контейнеру и вызвать raiseCounter() метод ASingletonProcessor SessionBean нашего примера приложения с

<?php

use AppserverIo\RemoteMethodInvocation\RemoteConnectionFactory;

require_once __DIR__ . '/vendor/autoload.php';

$connection = RemoteConnectionFactory::createContextConnection();
$connection->injectPort(8585);
$connection->injectAddress('127.0.0.1');
$connection->injectTransport('http');
$connection->injectAppName('example');

$session = $connection->createContextSession();
$session->setSessionId(md5('test'));
$proxy = $session->createInitialContext()->lookup('ASingletonProcessor');

echo $proxy->raiseCounter() . PHP_EOL;

В примере используется фиктивный идентификатор сеанса, созданный с помощью md5('test) который только для целей тестирования. Например, в реальном приложении вы будете использовать стандартный идентификатор сессии PHP.

Надеюсь, что это даст вам хорошее впечатление, как все может пойти 🙂

3

Другие решения

Других решений пока нет …