如何在symfony2中启动memcached会话?


How do you start a memcached session in symfony2?

我会尽量详细,因为我现在已经搜索了75个小时的解决方案。

撑自己. .

我正试图实现MemcacheD会话处理程序Symfony2:
我已经下载了必要的库,然后按照如下方式配置Symfony2:

In app/config.yml:

imports:
    # ....
    - { resource: services/session.yml }
framework:
    # ....
    session:
      handler_id:     session.handler.memcached

app/config/parameters.yml:

session_memcached_host:     127.0.0.1
session_memcached_port:     11211
session_memcached_prefix:   ng_
session_memcached_expire:   43200

app/services/session.yml:

services:
    session.memcached:
        class: Memcached
        arguments:
            persistent_id: %session_memcached_prefix%
        calls:
            - [ addServer, [ %session_memcached_host%, %session_memcached_port% ]]
    session.handler.memcached:
        class:     Symfony'Component'HttpFoundation'Session'Storage'Handler'MemcachedSessionHandler
        arguments: [@session.memcached, { prefix: %session_memcached_prefix%, expiretime: %session_memcached_expire% }]

到目前为止我最大的问题是:如何开始一个会话

正常情况下,你会有$session = new Session();但对于处理程序不适用,因为文档声明(转换为Memcached的代码):

$storage = new NativeSessionStorage(array(), new MemcachedSessionHandler());
$session = new Session($storage); 

,这确实有些奇怪,因为构造函数需要一个Memcached实例作为参数,这在官方文档

的示例中没有给出

我所做的是从正在运行的服务中获取实例:

$memcached = $this->get('session.memcached');
$storage = new NativeSessionStorage(array(), new MemcachedSessionHandler($memcached));
$session = new Session($storage); 

这并没有抛出任何异常,所以我用data填充会话:

$session->set('userName', $name);
$session->set('userfName', $fname);
$session->set('userPass', $pass);
$session->set('userId', $userId);
$session->set('userPost', $userPost);
$session->set('userImage', $userImage);
$session->set('logged', true);

一切都很完美?等等……我在另一个控制器上运行以下命令:

$session = $this->get('session');
var_dump($session->get('userId')); // returns null

这意味着会话没有持久化(Memcached日志另有说明),或者我做得不对,这导致了我的第二个问题:我如何从Memcached服务器读取会话?

请,我真的需要这个工作,因为我需要他们在websockets项目。

下面是我所做的:

app/config/config.yml:

session:
    cookie_lifetime: 43200
    # handler_id set to null will use default session handler from php.ini
    handler_id:  session
    save_path: ~

app/config/services.yml:

services:
    session.memcached:
        class: Memcached
        arguments:
            persistent_id: %session_memcached_prefix%
        calls:
            - [ addServer, [ %session_memcached_host%, %session_memcached_port% ]]
session:
    class:     Symfony'Component'HttpFoundation'Session'Storage'Handler'MemcachedSessionHandler
    arguments: [@session.memcached, { prefix: %session_memcached_prefix%, expiretime: %session_memcached_expire% }]

我得到的错误:

PHP可捕获的致命错误:参数1传递给Symfony'Component'HttpFoundation'Request::setSession()必须实现接口Symfony'Component'HttpFoundation'Session'SessionInterface,实例Symfony'Component'HttpFoundation'Session'Storage'Handler'MemcachedSessionHandler给定

Symfony全栈框架

如果您使用的是全栈Symfony框架,那么配置memcached作为会话处理程序就像在php.ini中指定它一样简单:

session.save_handler=memcached
session.save_path=localhost:11211

确保app/config/config.yml中的handler_id被设置为null (~)。这样Symfony将使用本地php处理程序:

framework:
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~

现在你可以开始使用你的会话。它将被存储在memcached中。

访问会话

会话可以从Request对象访问:

$request->getSession()->set('name', 'Kuba');
<<p> HttpFoundation组件/strong>

同样可以在全栈框架之外单独使用HttpFoundation组件来设置:

use Symfony'Component'HttpFoundation'Request;
use Symfony'Component'HttpFoundation'Session'Session;
use Symfony'Component'HttpFoundation'Session'Attribute'NamespacedAttributeBag;
use Symfony'Component'HttpFoundation'Session'Storage'NativeSessionStorage;
$storage = new NativeSessionStorage(array());
$session = new Session($storage, new NamespacedAttributeBag());
$request = Request::createFromGlobals();
$request->setSession($session);
上面的代码片段设置会话就像全栈框架一样(默认情况下)。这样,您放入的脚本将与完整的Symfony应用程序共享会话。

有一个很好的要点,将帮助您开始使用MemcachedSessionHandler在您的Symfony 2项目