Memcached在浏览器中失效但PHP命令行可用的问题求助
看你遇到的情况,核心就是CentOS7的LNMP环境里,浏览器跑PHP脚本连不上Memcached,但命令行执行同一脚本完全正常,结合你后来的telnet测试和错误码信息,咱们一步步来排查解决:
1. 先排查SELinux的限制(CentOS7默认开着,最常见原因)
CentOS7默认启用的SELinux会限制Nginx/PHP-FPM这类HTTP相关进程访问网络服务,包括Memcached。先临时关了试试:
setenforce 0
然后刷新浏览器测试脚本,如果能正常输出Memcached状态和值,那就是SELinux的锅。接下来给它加个永久规则,允许HTTP进程访问Memcached:
setsebool -P httpd_can_network_memcache 1
这个规则专门针对HTTP服务进程(PHP-FPM也受这个规则约束),加了之后就不用再担心SELinux拦着了。
2. 检查PHP-FPM的运行用户与Memcached的访问权限
- 先看看PHP-FPM用的什么用户跑的,打开
/etc/php-fpm.d/www.conf或者用命令查:grep 'user =' /etc/php-fpm.d/www.conf - 再检查Memcached的配置(一般在
/etc/sysconfig/memcached或者/etc/memcached.conf),确保它监听的是127.0.0.1(或者允许PHP-FPM用户所在的网络访问),如果用unix socket的话,有没有设置-U参数限制用户权限,别让PHP-FPM用户连不上。
3. 处理Memcached服务器被临时标记为不可用的问题
从你拿到的错误码MEMCACHED_SERVER_TEMPORARILY_DISABLED来看,Memcached客户端可能把服务器标记成不可用了。可以在脚本里加一行重置服务器列表的代码试试:
$m->resetServerList(); $m->addServer("localhost","11211");
另外也看看Memcached服务是不是正常跑着:
systemctl status memcached
要是刚重启过Memcached,客户端可能需要重新建立连接,重置服务器列表能解决这个问题。
4. 核对命令行PHP和PHP-FPM的配置差异
命令行PHP和PHP-FPM可能用的是不同的php.ini配置文件,咱们分别查一下:
- 命令行PHP的配置路径:
php --ini - PHP-FPM的配置路径:
php-fpm -i | grep 'Loaded Configuration File'
对比两者的Memcached扩展配置,比如有没有开memcached.use_sasl这类可能影响连接的选项,确保两边配置一致。
额外说下telnet测试的问题
你之前用telnet执行set/add报错,其实是命令格式不对,正确的telnet操作Memcached的格式应该是:
set test 0 0 9 testValue
解释下:set key flags exptime bytes,后面跟着值。0是标志位,0表示永不过期,9是testValue的长度。如果按正确格式执行还是报错,那得看看Memcached本身的问题,比如日志(一般在/var/log/memcached.log)里有没有报错,是不是内存分配不足或者启动权限有问题。
内容的提问来源于stack exchange,提问作者鏁尀 娼�,php;memcached

