2016-09-15 3 views
1

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

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

<?php 

namespace MyVendor\MyApp; 

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

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

Реализация внутри Servlet довольно прямо вперед, и работает как шарм, но я не могу найти любую документацию на получение доступа к этому в простой файл 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(); 
    } 
} 

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

Спасибо,

Питер

ответ

2

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

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

$ 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; 

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

Надеюсь, что дайте хорошее впечатление, как все могло бы быть :)

Смежные вопросы