【问题标题】:Using an appserver.io SessionBean in a plain php script在纯 php 脚本中使用 appserver.io SessionBean
【发布时间】:2016-09-15 13:33:39
【问题描述】:

我正在寻找一种方法来用 appserver.io SessionBeans 替换现有应用程序中的选择功能,但我找不到有关如何在普通 php 类中访问 SessionBean 的示例。

我有一个来自示例的超级简单的 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();
    }
}

有人可以指点我正确的方向吗?

谢谢,

彼得

【问题讨论】:

    标签: php appserver


    【解决方案1】:

    由于 SessionBeans 作为真正的 PHP 对象存在于容器中,因此无法从 e 访问它们。 G。 PHP-FPM 应用程序。为此,我们实现了一个客户端,它向会话 bean 返回一个代理并允许您执行它的方法。另外需要配置持久化容器本身,因为默认情况下,出于安全原因,我们已停用远程连接。

    因此,您应该做的第一件事是在项目中安装 appserver-io/rmi 包作为 Composer 要求,例如。 g.

    $ composer install appserver-io/rmi
    

    之后,您必须配置一个允许远程访问持久性容器的服务器,例如。 G。您可以在etc/appserver/appserver.xml 文件中的&lt;container name="combined-appserver"&gt; 中添加以下XML sn-p

    <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。

    希望这能给你一个好印象:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 2020-03-22
      • 2012-10-18
      • 1970-01-01
      • 2011-04-05
      • 2021-05-16
      • 1970-01-01
      相关资源
      最近更新 更多