Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320778
  • 博文数量: 96
  • 博客积分: 230
  • 博客等级: 二等列兵
  • 技术积分: 722
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-13 22:25
个人简介

心安处即吾乡!

文章分类

全部博文(96)

文章存档

2016年(1)

2014年(79)

2013年(7)

2012年(9)

我的朋友

分类: PHP

2014-06-11 17:03:45

问题描述:同一个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代码如下:

点击(此处)折叠或打开

  1. <?php
  2.     $redis = new Redis();
  3.     #var_dump($redis);

  4.     $ret = $redis->connect('192.168.1.136', 6379, 5);

  5.     var_dump($ret);

  6.     if ($ret) {
  7.         $redis->close();
  8.     } else {
  9.         echo 'do nothing...\n';
  10.     }
  11. ?>



阅读(2816) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~