问题描述:同一个redis连接测试脚本test_redis_connect.php,在命令行下以cli模式运行后连接redis成功,而将其放在webserver的DocumentRoot目录/var/www/html/下通过浏览器访问时,连接redis失败,apache的错误日志如下:
PHP Fatal error: Uncaught exception 'RedisException' with message 'Redis server went away' in /var/www/html/web/
test_redis_connect.php
解决步骤:
1.首先,通过phpinfo或php -i | grep -i redis,或php -m确认php的redis扩展安装成功
2.新建redis连接测试脚本test_redis_connect.php,以cli方式命令行运行该脚本,成功连接到redis服务器
3.通过浏览器以web方式请求该脚本,连接redis服务器失败,怀疑apache运行用户与cli执行用户的权限差异导致了二者的连接差异
4.通过修改/usr/lib64/php/modules/下扩展文件的权限,以及apache用户的运行权限,重复执行第3步测试仍然失败,排除执行权限问题
5.通过tcpdump对6379端口截包发现,命令行运行test_redis_connect.php时有发送tcp连接请求,而web请求test_redis_connect.php时,6379端口没有任何tcp连接请求信息,由此怀疑可能操作系统的网络安全策略有问题
6.确认防火墙iptables已经关闭,经查,CentOS系统SElinux阻止httpd进行网络连接,通过将SElinux的运作模式由enforcing【强制模式】调整为permissive【宽容模式】后,重复执行第5步测试,
此时web请求test_redis_connect.php时,tcpdump能截取到6379端口的tcp连接请求信息,测试脚本连接redis服务器成功
7.至此,问题已经确定并解决,注意SElinux的permissive【宽容模式】只是临时设置,永久设置或关闭需要重启操作系统
测试程序test_redis_connect.php代码如下:
-
<?php
-
$redis = new Redis();
-
#var_dump($redis);
-
-
$ret = $redis->connect('192.168.1.136', 6379, 5);
-
-
var_dump($ret);
-
-
if ($ret) {
-
$redis->close();
-
} else {
-
echo 'do nothing...\n';
-
}
-
?>
阅读(2816) | 评论(0) | 转发(0) |