gpt4 book ai didi

zend-framework - 用于 Memcache 的 Zend_Session SaveHandler

转载 作者:行者123 更新时间:2023-11-30 23:58:30 24 4
gpt4 key购买 nike

最近发现 Zend_Session 的 DbTable SaveHandler 的实现方式并未针对高性能进行优化,因此,我一直在研究改用 Memcache 进行 session 管理。

我找到了一个不错的模式/类,用于将我的 Bootstrap 中的 Zend_Session SaveHandler 从 DbTable 更改为 Memcache here并将其添加到我的网络应用程序中。

在我的 Bootstrap 中,我像这样更改了 SaveHandler:

从:

Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));

到:
Zend_Session::setSaveHandler(new MyApp_Session_SaveHandler_Memcache(Zend_Registry::get("cache")));

所以,我的 session 初始化看起来像这样:
Zend_Loader::loadClass('MyApp_Session_SaveHandler_Memcache');
Zend_Session::setSaveHandler(new MyApp_Session_SaveHandler_Memcache(Zend_Registry::get("cache")));
Zend_Session::start();
// set up session space
$this->session = new Zend_Session_Namespace('MyApp');
Zend_Registry::set('session', $this->session);

如您所见,该站点提供的类与 Bootstrap 中的简单 loadClass 和 SaveHandler 更改快速集成,并且它可以在我的本地开发环境中正常工作(Web 应用程序和内存缓存在同一系统上)。

我还使用 PROD 中的远程 memcache 服务器测试了托管在本地开发环境中的 Web 应用程序,以查看它如何通过网络执行,并且它似乎也可以正常工作。

但是,在我的暂存环境(模拟生产环境)中,我的 zend 应用程序托管在 server1 上,memcache 托管在 server2 上,似乎几乎所有其他请求都完全被特定的错误消息炸毁。

我捕获的错误信息包括消息“ session 已由 session.auto-start 或 session_start() 启动”,第二个/相关表明 Zend_Session::start() 获得了一个连接被拒绝,并带有“错误 #8 MemcachePool::get()"涉及框架文件 ../Zend/Cache/Backend/Memcached.php 的第 180 行。

我已经确认我的 php.ini 将 session.auto_start 设置为 0,并且我的代码中 Zend_Session::start() 的唯一实例在我的 Bootstrap 中。此外,我在初始化 session 之前初始化了我的缓存、数据库和助手(以确保用于实例化我的新 SaveHandler 的 Zend_Registry::get("cache") 参数是有效的。

我只发现了关于如何为 Zend_Session 成功使用 Memcache 的两个有值(value)的资源,并且我还查看了 ZF 的 Zend_Cache_Backend 和 Zend_Session “高级用法”文档,但我无法确定使用 Memcache 出现此错误的原因或原因它不能与专用/远程 memcache 服务器一致地工作。
  • 有人理解这个问题吗?
  • 有没有人有解决这个问题的经验?
  • 是否有人在他们的 ZF Web 应用程序中以他们可以推荐的方式使用 Memcache 进行 session 管理?

  • 请确保包含您所做的任何/所有 Zend_Session 和/或 Zend_Cache 配置或您用来使其工作的其他欺骗或巫术。

    谢谢!

    最佳答案

    这个差点把我的脑袋炸了。

    首先,很抱歉这本书有问题……我想画出一幅完整的情况。不幸的是,我错过了我出色的同事发现的一些关键细节。

    所以,一旦你安装了,很可能在你刚开始测试守护进程时,你会这样做:

    root# memcached -d -u 无人 -m 512 127.0.0.1 -p 11211

    此命令将启动 memcached,使用 localhost 上的 512MB 和默认端口 11211。

    你看到我在那里做了什么吗?这意味着它被设置为只处理发送到 LOOPBACK 网络接口(interface)的请求。



    我的问题是,我无法让我的网络应用程序与远程 memcached 服务器一起使用。

    因此,当您真正想要启动 memcached 服务器以接受来自远程系统的请求时,您可以执行以下操作:

    root# memcached -d -u 无人 -m 512 -l 192.168.0.101 -p 11211

    这解决了我的问题。这将启动我的 memcached 守护程序,将其设置为使用绑定(bind)到 IP 192.168.0.101 的 512MB 并监听默认端口 11211。

    现在,发送到该 IP 和端口的任何请求都将被服务器接受并按照您的预期进行处理。

    Here's a networking doc reference ...RTFM...第二次!

    关于zend-framework - 用于 Memcache 的 Zend_Session SaveHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3870227/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com