在普通 php 脚本中使用 appserver.io SessionBean
Using an appserver.io SessionBean in a plain php script
我正在寻找一种方法来用 appserver.io SessionBeans 替换现有应用程序中的 select 功能,但我找不到有关如何在普通 [=29] 中访问 SessionBean 的示例=] class。
我有一个来自示例的超级简单的 Singleton SessionBean:
<?php
namespace MyVendor\MyApp;
/**
* @Singleton(name="MySingletonBean")
*/
class MySingletonBean extends \Stackable
{
protected $counter = 0;
public function raiseMe()
{
return $this->counter++;
}
}
Servlet 内部的实现非常简单,工作起来很有魅力,但我找不到任何关于在 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();
}
}
有人能给我指出正确的方向吗?
谢谢,
彼得
由于 SessionBeans 在容器中作为真实的 PHP 对象存在,因此无法从 e. G。 PHP-FPM 应用程序。为此,我们实现了一个客户端,returns 会话 bean 的代理并允许您执行它的方法。此外,有必要配置持久性容器本身,因为默认情况下,出于安全原因,我们已停用远程连接。
因此,您应该做的第一件事是在您的项目中安装 appserver-io/rmi
包作为 Composer 要求,例如。 g.
$ composer install appserver-io/rmi
之后,您必须配置一个服务器,允许远程访问持久性容器,例如。 G。您可以将以下 XML 片段添加到 etc/appserver/appserver.xml
文件
中的 <container name="combined-appserver">
<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
服务器配置。
最后,您可以连接到持久性容器并使用
调用示例应用程序的 ASingletonProcessor
SessionBean 的 raiseCounter()
方法
<?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)
生成的虚拟会话 ID,仅用于测试目的。例如,在实际应用程序中,您将使用默认的 PHP Session-ID。
希望这能给您一个好的印象:)
我正在寻找一种方法来用 appserver.io SessionBeans 替换现有应用程序中的 select 功能,但我找不到有关如何在普通 [=29] 中访问 SessionBean 的示例=] class。
我有一个来自示例的超级简单的 Singleton SessionBean:
<?php
namespace MyVendor\MyApp;
/**
* @Singleton(name="MySingletonBean")
*/
class MySingletonBean extends \Stackable
{
protected $counter = 0;
public function raiseMe()
{
return $this->counter++;
}
}
Servlet 内部的实现非常简单,工作起来很有魅力,但我找不到任何关于在 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();
}
}
有人能给我指出正确的方向吗?
谢谢,
彼得
由于 SessionBeans 在容器中作为真实的 PHP 对象存在,因此无法从 e. G。 PHP-FPM 应用程序。为此,我们实现了一个客户端,returns 会话 bean 的代理并允许您执行它的方法。此外,有必要配置持久性容器本身,因为默认情况下,出于安全原因,我们已停用远程连接。
因此,您应该做的第一件事是在您的项目中安装 appserver-io/rmi
包作为 Composer 要求,例如。 g.
$ composer install appserver-io/rmi
之后,您必须配置一个服务器,允许远程访问持久性容器,例如。 G。您可以将以下 XML 片段添加到 etc/appserver/appserver.xml
文件
<container name="combined-appserver">
<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
服务器配置。
最后,您可以连接到持久性容器并使用
调用示例应用程序的ASingletonProcessor
SessionBean 的 raiseCounter()
方法
<?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)
生成的虚拟会话 ID,仅用于测试目的。例如,在实际应用程序中,您将使用默认的 PHP Session-ID。
希望这能给您一个好的印象:)