Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在symfony2中启动memcached会话?_Php_Session_Symfony_Memcached - Fatal编程技术网

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

Php 如何在symfony2中启动memcached会话?,php,session,symfony,memcached,Php,Session,Symfony,Memcached,我会尽量详细,因为我现在正在寻找一个75小时的解决方案 振作起来。。我们开始: 我正在尝试为Symfony2实现MemcacheD会话处理程序: 我已下载了必要的库,然后按如下方式配置了Symfony2: 在app/config.yml中: imports: # .... - { resource: services/session.yml } framework: # .... session: handler_id: session.ha

我会尽量详细,因为我现在正在寻找一个75小时的解决方案

振作起来。。我们开始:

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

在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
session:
    cookie_lifetime: 43200
    # handler_id set to null will use default session handler from php.ini
    handler_id:  session
    save_path: ~
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% }]
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=newsession()
但不适用于处理程序,因为文档说明(代码转换为
Memcached
):

这确实有些奇怪,因为构造函数需要一个
Memcached
实例作为参数,这在官方示例中没有给出

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

$memcached = $this->get('session.memcached');
$storage = new NativeSessionStorage(array(), new MemcachedSessionHandler($memcached));
$session = new Session($storage); 
这并没有引发任何异常,但又发生了一次,因此我用数据填充了会话:

$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
log说不是这样),要么我做得不对,这导致了我的第二个问题:我如何从Memcached服务器读取会话?

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

以下是我所做的评论:

app/config/config.yml

session_memcached_host:     127.0.0.1
session_memcached_port:     11211
session_memcached_prefix:   ng_
session_memcached_expire:   43200
session:
    cookie_lifetime: 43200
    # handler_id set to null will use default session handler from php.ini
    handler_id:  session
    save_path: ~
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% }]
app/config/services.yml

session_memcached_host:     127.0.0.1
session_memcached_port:     11211
session_memcached_prefix:   ng_
session_memcached_expire:   43200
session:
    cookie_lifetime: 43200
    # handler_id set to null will use default session handler from php.ini
    handler_id:  session
    save_path: ~
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可捕获的致命错误:传递给Symfony\Component\HttpFoundation\Request::setSession()的参数1必须实现接口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\u id
设置为null(
~
)。这样,Symfony将使用本机php处理程序:

framework:
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~
现在您可以开始使用会话了。它将被存储在memcached中

访问会话

可以从
请求
对象访问会话:

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

可以在完整堆栈框架之外单独使用HttpFoundation组件进行设置:

使用Symfony\Component\HttpFoundation\Request;
使用Symfony\Component\HttpFoundation\Session\Session;
使用Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
使用Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
$storage=新的NativeSessionStorage(数组());
$session=新会话($storage,new NamespacedAttributeBag());
$request=request::createFromGlobals();
$request->setSession($session);

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

有一个很好的方法可以帮助您在Symfony 2项目中开始使用MemcachedSessionHandler。

$session=$This->get('session')=/=
$memcached=$this->get('session.memcached')-最好将会话服务配置为会话(而不是session.memcached),这样您就不会遇到这样的错误。第一个命令获取会话实例,第二个命令获取memcached实例,我无法正确获取您的注释。。您能解释一下吗?将会话服务配置为已使用memcached会话。然后你只需要使用
$session=$this->get('session')
(或者更好地使用参数注入),你不需要关心它是内存缓存、磁盘上还是存储在月球上的石头上。你很有趣,我喜欢你:D但是这里的帮助“配置会话服务”你是什么意思?当你写
$this->get时('session')
您正在访问一个配置为“会话服务”的对象。它在服务配置中配置为“会话”条目。看到了吗?使用这些服务不是一件好事,对吗?谢谢你,对我在githubSymfony框架上造成的麻烦表示抱歉。Symfony框架还允许在不更改php.ini的情况下配置memcached会话。@JakubZalas:谢谢你
确保处理程序id设置为null(~)在你的app/config/config.yml
中,它帮助我解决了很多登录问题(第二次工作时……总是这样)。现在它正常工作了:)