背景:现在分布式服务搭建往往需要做session共享,这时候就需要缓存服务器来实现,我这里使用memecache,但是在php7中使用遇到了读写失败的问题
首先要知道memcached在PHP有两个扩展。分别是:
1、memcache
这个是早期的东西,所以现在网上很多资料可能都是以这个来说明的,如果你使用php5的话,用memcache的扩展把session存入memcache缓存服务中一点问题都没有,后面的内容也不需要再看了
**** 不过注意,php7的memcache的扩展也得到git去得到,官网的提供的不兼容php7 ****
2、memcached
如果你使用PHP7版本使用上面的memcache扩展做session存储可能就出现session_start()时读写memcached缓存服务失败
PHP Warning: session_start(): Failed to read session data: memcache
这时候你就需要php7的memcached扩展来解决了。但是同样,官方也没有提供,需要到git去得到。
这里有具体的安装php7下memcached服务扩展的方法
以上安装完毕合适的扩展后,我们开始:
我这里使用PHP的ini_set()函数临时配置php.ini,当然你也可以去php.ini中全局配置。
使用memcache扩展的话,下面这样配置是完全没有问题的
define("MEMCACHE_IP", "tcp://172.18.72.35:18881"); //只是定义一个常量MEMCACHE_IP
ini_set("session.save_handler", "memcache"); //是memcache
ini_set("session.save_path", MEMCACHE_IP);
但如果你使用memcached扩展用上面的配置参数,可能会产生这样的报错
Failed to write session lock: getaddrinfo() or getnameinfo() HOSTNAME LOOKUP
需要修改为:
define("MEMCACHE_IP", "172.18.72.35:18881"); //修改的地方,地址不能有tcp://
ini_set("session.save_handler", "memcached"); //是memcached,多一个d
ini_set("session.save_path", MEMCACHE_IP);
配置完后,测试memcached中session读写顺利通过。
最后总结,产生问题的主要原因还是memcache官方没有及时更新兼容PHP7版本。
另外还有,一些解决问题的思路,通过自写session处理类来解决,以下是参考,这里就不多做讨论了
https://blog.csdn.net/sinat_34712164/article/details/80310320
https://blog.csdn.net/doomsday0417/article/details/71087420(改成files等于不用memched了)
https://www.php.net/manual/zh/function.session-start.php(php官网说明:ctrl+F搜索session_start(): Failed to read session data)
https://blog.csdn.net/yuhunQ/article/details/88816899?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param
有问题欢迎交流