Я ищу способ заменить выбранную функциональность в существующем приложении на 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();
}
}
Может кто-нибудь, пожалуйста, укажите мне правильное направление?
Спасибо,
Питер
Поскольку 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">[email protected]</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.
Надеюсь, что это даст вам хорошее впечатление, как все может пойти 🙂
Других решений пока нет …