你如何在symfony2中启动memcached会话?

Sek*_*kai 5 php session memcached symfony

我会尝试尽可能详细,因为我现在正在寻找,75小时的解决方案..

支撑你自己..我们走了:

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

app/config.yml:

imports:
    # ....
    - { resource: services/session.yml }

framework:
    # ....
    session:
      handler_id:     session.handler.memcached
Run Code Online (Sandbox Code Playgroud)

app/config/parameters.yml:

session_memcached_host:     127.0.0.1
session_memcached_port:     11211
session_memcached_prefix:   ng_
session_memcached_expire:   43200
Run Code Online (Sandbox Code Playgroud)

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% }]
Run Code Online (Sandbox Code Playgroud)

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

通常情况下,你会有,$session = new Session(); 但不是处理程序,因为文档说明(代码转换为Memcached):

$storage = new NativeSessionStorage(array(), new MemcachedSessionHandler());
$session = new Session($storage); 
Run Code Online (Sandbox Code Playgroud)

这有点奇怪,因为构造函数需要一个Memcached参数实例,官方文档的例子中没有给出

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

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

这没有抛出任何异常但是又一次,所以我在会话中填充了数据:

$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);
Run Code Online (Sandbox Code Playgroud)

一切都很完美?等等......我继续使用另一个控制器并运行以下命令:

$session = $this->get('session');
var_dump($session->get('userId')); // returns null
Run Code Online (Sandbox Code Playgroud)

这意味着会话没有被持久化(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: ~
Run Code Online (Sandbox Code Playgroud)

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% }]
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

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

Jak*_*las 12

Symfony完整堆栈框架

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

session.save_handler=memcached
session.save_path=localhost:11211
Run Code Online (Sandbox Code Playgroud)

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

framework:
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
Run Code Online (Sandbox Code Playgroud)

现在您可以开始使用您的会话了.它将存储在memcached中.

访问会话

可以从Request对象访问会话:

$request->getSession()->set('name', 'Kuba');
Run Code Online (Sandbox Code Playgroud)

HttpFoundation组件

只需使用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);
Run Code Online (Sandbox Code Playgroud)

上面的代码片段就像完整的堆栈框架一样设置了会话(默认情况下).这样,您将此代码放入的脚本将与完整的Symfony应用程序共享会话.