我会尽量详细说明,因为我现在正在寻找,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
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
实例用于参数,而官方docs
我所做的是从服务运行中获取实例:
$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
日志另有说明)或者我做得不对,这导致了我的第二个问题:如何从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 Catchable致命错误:传递给Symfony \ Component \ HttpFoundation \ Request :: setSession()的参数1必须实现接口Symfony \ Component \ HttpFoundation \ Session \ SessionInterface,Symfony \ Component \ HttpFoundation \ Session \ Storage \ Handler的实例\ MemcachedSessionHandler给出
答案 0 :(得分:12)
Symfony完整堆栈框架
如果您使用完整堆栈Symfony框架,那么将memcached配置为会话处理程序就像在php.ini中指定它一样简单:
session.save_handler=memcached
session.save_path=localhost:11211
确保handler_id
中的~
设置为空(app/config/config.yml
)。这样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');
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);
以上代码段设置会话就像完整堆栈框架一样(默认情况下)。这样,您将此代码放入的脚本将与完整的Symfony应用程序共享会话。
答案 1 :(得分:2)
有一个很好的gist可以帮助您在Symfony 2项目中开始使用MemcachedSessionHandler。