热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php利用memcache存session丢数据的问题

php利用memcache存session丢数据的问题:先上测试代码,大家也可以测试下index.phpclent.html无标题文档之后大家可以打印一下SESSION看看,结果经
先上测试代码,大家也可以测试下
index.php


clent.html



之后大家可以打印一下SESSION看看,结果经常会丢数据。SESSION经常就记录不全。不知道是为什么,还请高手来解释下。

下面附上我的其他配置
libevent-2.0.18-stable.tar.gz 服务器端
memcached-1.4.13.tar.gz 服务器端
memcache-2.2.6.tgz PHP客户端



PHP.ini
session.save_path="tcp://192.168.234.234:11211"
session.save_handler = memcache

PHP组件
php_memcache.dll 版本是2.2.6.0


回复讨论(解决方案)

会否是你测试的问题。
共有6次对index.php的请求:
第一次, 初始化session_id COOKIE.
但当第二次第三次,很可能第一次服务器还没来得及响应,请求就已经发出。而此时session_id COOKIE还未设置,于是再度初始化session_id COOKIE。
这样第一次请求设置的session_id COOKIE就被覆盖了,数据也就没法读出来了

不是session_start()的问题。
现在不说session,就是直接去用memcache的set方法,也有数据丢失。
代码如下

connect("192.168.234.234",11211);$Method = $_GET['method']."|";if($mem->get('key')){ $aa = $mem->get('key'); $mem->set('key',$aa.$Method,0,60);}else{ $mem->set('key',$Method,0,60); }$val = $mem->get('key');?>

有没有高人啊。。。问题解决了分数加倍送啊

现在不说session,就是直接去用memcache的set方法,也有数据丢失。

我觉得这个就是传说中的人品问题了...

虽然不曾在生产环境里使用,不过我觉得一个老牌的memcache 不应该存在这种丢三拉四的情况吧.

....
问题我公司里的2台memcache都存在这个问题。。。。
而且这个丢失很容易重现。
我怀疑是不是memcache或PHP配置的有问题。。。

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1

# Controls the use of TCP synCOOKIEs
net.ipv4.tcp_synCOOKIEs = 1

# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536

# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 4294967295

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 268435456

这是memcache的sysctl.conf文件的内容。默认的。没动过。。。
麻烦memcache玩的熟的人给指点下。

补充一下,这2个memcache一个是普通办公台式机装的linux,一个是我笔记本虚拟出来的linux,主要是做测试用。不知道是否和机子还有关系?

你只写不读,如何能保证数据被正确写入了呢?
写后要校对,至少要有CRC校验
在这个层面上,你不应该相信任何人

我们在讨论的代码,都是原理性代码,实际使用时都是要另加判错的
就说 memcache 也只是给你一个通讯的环境

并不是简单的几行代码就能解决问题的
软件开发就是不断地发现问题和解决问题,一旦不需要维护了,那么这个软件就快要寿终正寝了

....当然是读了才发现的问题啊。。
我在memcache里遍历了数据,确实是没有写进去。并不是没读出来。

是记录不全呢,还是完全丢失呢?这个是两个性质的事情。如果实在没有解决方法,你可以试下 redis
不过我没用过,只是一直耳闻是memcache的替代品

....当然是读了才发现的问题啊。。
我在memcache里遍历了数据,确实是没有写进去。并不是没读出来。 那你就是没理解我的意思
我是说:写了马上就读,能读到并不错,这才表示写进去了
你以为如何?

1你说过用两台memcache测试都丢失,好像概率还不一样。请确定一个你测试的数据是否一样,中文还是全英的。
2两台都有问题,可以检查一下代码。先别用memcache,用mysql实现了。换之前,在实现session的函数中,都把数据写到一个文件中,检查一下。
3使用tcpdump,检查一下请求是否发过了。要是还是不行。改下memcache吧,也是跟踪变量。(感谢上天,我暂时没这需求)。

我用的方法比较笨,希望对你有点启发。

1你说过用两台memcache测试都丢失,好像概率还不一样。请确定一个你测试的数据是否一样,中文还是全英的。
2两台都有问题,可以检查一下代码。先别用memcache,用mysql实现了。换之前,在实现session的函数中,都把数据写到一个文件中,检查一下。
3使用tcpdump,检查一下请求是否发过了。要是还是不行。改下memcache吧,也是跟踪变量。(感谢上天,我暂时没这需求)。
……
测试7数据斗一样,见我上面发的代码。还有我每次接收到请求写入一比

手机发的字真难打。我次在接收到请求后都把请求的值写到库里。可以发现库里记录正常,但memcache不论是还存的session还是自定义一个变量存,都有写入不完整的情况。我不清楚是不是配置出了问题,我的配置版本和文件都贴出来了。麻烦大家帮看下是不是配置有问题。

另外各位大侠有没有手头有memcache环境的,帮忙看下上面的代码在你们的环境下是否有丢失,如果没问题可否把使用的版本发下我看是不是我这版本有问题,3q

你应该考虑到的是浏览器几乎同时并发请求的问题,你的新值是根据几毫秒前读出的值来设定的。可在这点时间里,完全有可能有新的值插入成功。如果再插入,那么将造成前面写入的新值还没被读出,反而立即被覆盖了。所以丢失数据很正常。
你完全可以在客户端或者服务器端写个测试看看,比较一下每次停顿一秒和同时并发的效果。

你还没说你测试页面返回的值是什么那?
看你程序你想要的结果123456.
js是顺利加载。应该没并发的问题吧。你检查数据的时候,主要检查一下sessionid

不用看 肯定哪个地方 刷新释放了

$mem->set('key',$aa.$Method,0,60);


失效时间为60秒

你可以把60值修改为更大。

你还没说你测试页面返回的值是什么那?
看你程序你想要的结果123456.
js是顺利加载。应该没并发的问题吧。你检查数据的时候,主要检查一下sessionid
是的,按理说应该出来是123456,但就像16楼说的一样,他的请求几乎是同时过来的,最终数据读出来的顺比并不是123456.可能会是512436这种。但是中间会丢,成了513

$mem->set('key',$aa.$Method,0,60);


失效时间为60秒

你可以把60值修改为更大。
这个我都试过了。都没用。

你应该考虑到的是浏览器几乎同时并发请求的问题,你的新值是根据几毫秒前读出的值来设定的。可在这点时间里,完全有可能有新的值插入成功。如果再插入,那么将造成前面写入的新值还没被读出,反而立即被覆盖了。所以丢失数据很正常。
你完全可以在客户端或者服务器端写个测试看看,比较一下每次停顿一秒和同时并发的效果。

应该是并发写的问题。我把每次请求后生成的SESSION都写入到数据库以后发现,SESSION存的值经常就被重写了,而不是在后面追加的。
下面这是按我贴出的测试代码进行的一次测试结果。我在上面的代码后面加了写入数据库的操作。可以看出第一个先到的请求是4,SESSION的值被写成了4,第二个是5,session本应该是45,却被直接写成了5,

请求值 请求时间 session_id 当前生成的SESSION值
"4",1334029029,"7j1jcsdkv583cb60nb3kfemnd6","4"
"5",1334029029,"7j1jcsdkv583cb60nb3kfemnd6","5"
"6",1334029029,"7j1jcsdkv583cb60nb3kfemnd6","6"
"2",1334029029,"7j1jcsdkv583cb60nb3kfemnd6","2"
"1",1334029029,"7j1jcsdkv583cb60nb3kfemnd6","1"
"3",1334029029,"7j1jcsdkv583cb60nb3kfemnd6","43"

如果是并发的问题,那么你用mysql存储也一样有问题。并发问题解决不了,那谁还用了。

我邮箱:go123678@126.com。你发下。

使用APMserver5.2.6集成开发包,已经集成了memcache.
测试完成成功。

memcache_session.php (摘自http://imysql.cn/?q=node/215)

connect(MEMCACHE_HOST , MEMCACHE_PORT)) { die('Fatal Error: Can not connect to memcache host '. MEMCACHE_HOST .':'. MEMCACHE_PORT); } return TRUE; } // }}} /** {{{ sessOpen($pSavePath, $name) * * @param String $pSavePath * @param String $pSessName * * @return Bool TRUE/FALSE */ public function sessOpen($pSavePath = '', $pSessName = '') { self::$mSessSavePath = $pSavePath; self::$mSessName = $pSessName; return TRUE; } // }}} /** {{{ sessClose() * * @param NULL * * @return Bool TRUE/FALSE */ public function sessClose() { return TRUE; } // }}} /** {{{ sessRead($wSessId) * * @param String $wSessId * * @return Bool TRUE/FALSE */ public function sessRead($wSessId = '') { $wData = self::$mMemcacheObj->get($wSessId); //先读数据,如果没有,就初始化一个 if (!empty($wData)) { return $wData; } else { //初始化一条空记录 $ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME); if (TRUE != $ret) { die("Fatal Error: Session ID $wSessId init failed!"); return FALSE; } return TRUE; } } // }}} /** {{{ sessWrite($wSessId, $wData) * * @param String $wSessId * @param String $wData * * @return Bool TRUE/FALSE */ public function sessWrite($wSessId = '', $wData = '') { $ret = self::$mMemcacheObj->replace($wSessId, $wData, 0, SESS_LIFTTIME); if (TRUE != $ret) { die("Fatal Error: SessionID $wSessId Save data failed!"); return FALSE; } return TRUE; } // }}} /** {{{ sessDestroy($wSessId) * * @param String $wSessId * * @return Bool TRUE/FALSE */ public function sessDestroy($wSessId = '') { self::sessWrite($wSessId); return FALSE; } // }}} /** {{{ sessGc() * * @param NULL * * @return Bool TRUE/FALSE */ public function sessGc() { //无需额外回收,memcache有自己的过期回收机制 return TRUE; } // }}} /** {{{ initSess() * * @param NULL * * @return Bool TRUE/FALSE */ public function initSess() { $domain = '.imysql.cn'; //不使用 GET/POST 变量方式 ini_set('session.use_trans_sid', 0); //设置垃圾回收最大生存时间 ini_set('session.gc_maxlifetime', SESS_LIFTTIME); //使用 COOKIE 保存 SESSION ID 的方式 ini_set('session.use_COOKIEs', 1); ini_set('session.COOKIE_path', '/'); //多主机共享保存 SESSION ID 的 COOKIE ini_set('session.COOKIE_domain', $domain); //将 session.save_handler 设置为 user,而不是默认的 files session_module_name('user'); //定义 SESSION 各项操作所对应的方法名: session_set_save_handler( array('MemacheSession', 'sessOpen'), //对应于静态方法 My_Sess::open(),下同。 array('MemacheSession', 'sessClose'), array('MemacheSession', 'sessRead'), array('MemacheSession', 'sessWrite'), array('MemacheSession', 'sessDestroy'), array('MemacheSession', 'sessGc') ); session_start(); return TRUE; }}//end class}//end define$memSess = new MemacheSession;$memSess->initSess();?>

memcache_test.php



index.html

另外发现你的index.php没有引入实现session的php文件。也没打印session值。

关注,我也出现了这个问题。

我也出现这个问题

推荐阅读
  • 包含phppdoerrorcode的词条 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • Python中判断一个集合是否为另一集合子集的两种高效方法及其应用场景分析 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 本文探讨了在PHP中实现MySQL分页查询功能的优化方法与实际应用。通过详细分析分页查询的常见问题,提出了多种优化策略,包括使用索引、减少查询字段、合理设置缓存等。文章还提供了一个具体的示例,展示了如何通过优化模型加载和分页参数设置,显著提升查询性能和用户体验。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 本文介绍了一种利用PHP cURL库高效提取Sohu邮箱联系人列表的方法。通过设置错误报告级别、定义Cookie文件路径等关键步骤,确保了代码的稳定性和可靠性。经过实际测试,该方法在2012年3月24日被验证为有效,能够快速准确地获取联系人信息。此外,文章还提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 利用Telnet进行Memcached操作详解
    在使用Telnet对Memcached进行操作前,需确保Memcached服务已启动。可通过命令如 `ps -ef | grep memcached` 或 `netstat -l | grep memcache` 来检查服务状态。此外,建议验证端口监听情况以确保连接无误。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文深入探讨了WinRing0及其源代码实现,详细解析了如何通过获取Ring0权限在应用程序中直接执行需要Ring0权限的CPU指令。此外,文章还提供了实例截图和核心代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
那0年_277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有