用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3508|回复: 14
收起左侧

[已解决] CI使用Redis缓存,每次执行完操作之后的返回中就会包含redi...

[复制链接]
发表于 2016-10-13 12:44:03 | 显示全部楼层 |阅读模式
本帖最后由 liaow10 于 2016-10-13 16:55 编辑

$config['redis']=true;
$config['socket_type'] = 'tcp';
$config['host'] = '127.0.0.1';
$config['password'] = NULL;
$config['port'] = 6379;
$config['timeout'] = 0;

上面这串配置是放在config/redis.php里面的,按照官网手册上面的说明新建的一个文件,然后写上这些内容。在我自己的控制器User.php中,原本是使用这种方式来返回客户端消息的:

function response($result, $data) {
        $_SESSION['last_active'] = time();
        $rep = array(
                'result' => $result,
                'data' => $data);
        header("Content-type: application/json");
        echo json_encode($rep);
        exit();
}


在处理函数中直接调用response($res, $data); 加入关于redis cache的有关内容之前,一切正常,返回如下:

{"result":0,"data":{"user":{"id":"3","username":"h@gmail.com","nickname":"heldf"},"token":"xI4U"}}

----------------------------------------------

下面开始使用redis cache。在response()返回之前,仅仅加了这句,用于测试redis是否配置成功,$this->cache->redis->is_supported(); 然后客户端就得到了这样的返回:

$config['redis']=true;
$config['socket_type'] = 'tcp';
$config['host'] = '127.0.0.1';
$config['password'] = NULL;
$config['port'] = 6379;
$config['timeout'] = 0;

{"result":0,"data":{"user":{"id":"3","username":"h@gmail.com","nickname":"heldf"},"token":"xI4U"}}

正常情况应该是只有下面那些内容,而不包含上面那串config的

求各位老司机帮助!!!(下面是详细代码,系统是Debian,确定安装了redis服务,命令行使用redis-cli可以连接并使用redis)

---------------------------------------------
---- config/autoload.php
// 添加了自动载入driver:
$autoload['drivers'] = array('cache');

---- controllers/User.php
// 自己写的控制器
function response($result, $data) {
        $_SESSION['last_active'] = time();
        $rep = array(
                'result' => $result,
                'data' => $data);
        header("Content-type: application/json");
        echo json_encode($rep);
        exit();
}

class User extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
        }

        public function login()
        {
                $res = RETURN_OK;
                $data = NULL;

                $this->cache->redis->is_supported(); ////////// Err
                response($res, $data);
        }

}

上面代码,去掉Err行,返回如下:
{"result":0,"data":null}

加上Err行,返回如下:
$config['redis']=true;
$config['socket_type'] = 'tcp';
$config['host'] = '127.0.0.1';
$config['password'] = NULL;
$config['port'] = 6379;
$config['timeout'] = 0;

{"result":0,"data":null}
同时,将is_supported()方法改为save()也是一样的,操作成功,查询redis数据库可以查到,save()函数返回值正常,但是返回给客户端的内容总是有这部分内容。如果使用浏览器输入网址,得到的页面包含以上config文字内容,非常奇怪。 image_20161013151738.png
---------------------------------

我刚刚重新使用了CI3.1.0源码,修改了以下部分:
1. autoload.php中自动加载driver那里加入了cache
2. 新增了文件config/redis.php,内容与之前一致
3. 修改源码中的Welcome.php,修改后内容如下:
        public function index()
        {
                // $this->cache->redis->is_supported();
                echo "hehe";
                exit();
                //$this->load->view('welcome_message');
        }
4. 根目录下index.php复制到apache目录,修改正确的system和application地址

然后用浏览器查看对应网址,结果如下:
hehe
之后放开redis的注释,再次使用浏览器查看,结果如下:
$config['redis']=true; $config['socket_type']='tcp'; $config['host']='127.0.0.1'; $config['password']=NULL; $config['port']=6379; $config['timeout']=0; hehe

----------------------
怀疑是不是跟redis的配置有关系,CI没有配置成功接通redis,但是又确实成功操作了redis,所以想不太明白。
----------------------
找到原因了,因为redis.php文件没有加<?php来声明文件是php,结果就当纯文本输出了,太马虎了。。。






 楼主| 发表于 2016-10-13 15:58:18 | 显示全部楼层
Hex 发表于 2016-10-13 15:16
这肯定是你显示的,你看看是不是改了 CI 的源码,或者别人改了。

$this->cache->redis->is_supported(); ...

我刚刚重新使用了CI3.1.0源码,修改了以下部分:
1. autoload.php中自动加载driver那里加入了cache
2. 新增了文件config/redis.php,内容与之前一致
3. 修改源码中的Welcome.php,修改后内容如下:
        public function index()
        {
                // $this->cache->redis->is_supported();
                echo "hehe";
                exit();
                //$this->load->view('welcome_message');
        }
4. 根目录下index.php复制到apache目录,修改正确的system和application地址

然后用浏览器查看对应网址,结果如下:
hehe
之后放开redis的注释,再次使用浏览器查看,结果如下:
$config['redis']=true; $config['socket_type']='tcp'; $config['host']='127.0.0.1'; $config['password']=NULL; $config['port']=6379; $config['timeout']=0; hehe

----------------------
怀疑是不是跟redis的配置有关系,CI没有配置成功接通redis,但是又确实成功操作了redis,所以想不太明白。
 楼主| 发表于 2016-10-13 15:03:36 | 显示全部楼层
Hex 发表于 2016-10-13 14:47
代码贴全一些,$data 里包含了你的配置信息,应该是你手动传进去的,应该在某个地方,你不传就好了,CI 不 ...

$data是我用来返回给客户端的用户信息,$res是状态码,告诉客户端当前协议处理成功或者失败,response是我自己写的函数,用来复用,返回给客户端消息的。

我更新了代码,上面的代码及结果我都测试过,输出是这样的。麻烦帮忙看一下可以吗,非常感谢!
发表于 2016-10-13 16:29:20 | 显示全部楼层
liaow10 发表于 2016-10-13 15:58
我刚刚重新使用了CI3.1.0源码,修改了以下部分:
1. autoload.php中自动加载driver那里加入了cache
2. 新 ...

我知道了。。。你的 config/redis.php 要写成:

<?php
$config['xxx'] = 'xxx';

你少写了 <?php

不写 <?php 就变成了直接输出浏览器了啊!写代码不能太马虎了。
发表于 2016-10-13 14:19:54 | 显示全部楼层
返回什么东西,不应该是你写代码控制么?你不写 echo 等输出语句,是不可能返回东西给客户端的。
 楼主| 发表于 2016-10-13 14:35:20 | 显示全部楼层
Hex 发表于 2016-10-13 14:19
返回什么东西,不应该是你写代码控制么?你不写 echo 等输出语句,是不可能返回东西给客户端的。 ...

是我控制的,在我加redis cache的代码之前,输出是正常的。我加了一句之后就出问题了,不知道是我哪里配置错了,求帮忙~~

我更新了问题描述,详细描述了我的程序情况
发表于 2016-10-13 14:47:26 | 显示全部楼层
liaow10 发表于 2016-10-13 14:35
是我控制的,在我加redis cache的代码之前,输出是正常的。我加了一句之后就出问题了,不知道是我哪里配 ...

代码贴全一些,$data 里包含了你的配置信息,应该是你手动传进去的,应该在某个地方,你不传就好了,CI 不会自动给你搞这个的。这是个小问题,不用着急。
发表于 2016-10-13 15:13:53 | 显示全部楼层
liaow10 发表于 2016-10-13 15:03
$data是我用来返回给客户端的用户信息,$res是状态码,告诉客户端当前协议处理成功或者失败,response是 ...

你是说页面上会显示 $config 这几个字符?

不是很理解你的问题。。。。。。。。
你可以截图看看,总感觉你这是个小问题,疏忽造成的。。。。
 楼主| 发表于 2016-10-13 15:15:31 | 显示全部楼层
Hex 发表于 2016-10-13 15:13
你是说页面上会显示 $config 这几个字符?

不是很理解你的问题。。。。。。。。 ...

是的,如果使用浏览器输入地址,页面上就会显示这些。
发表于 2016-10-13 15:16:36 | 显示全部楼层
liaow10 发表于 2016-10-13 15:15
是的,如果使用浏览器输入地址,页面上就会显示这些。

这肯定是你显示的,你看看是不是改了 CI 的源码,或者别人改了。

$this->cache->redis->is_supported(); 这个是不是被人改过,不行就下载原版 CI 覆盖下。
发表于 2016-10-13 15:57:53 | 显示全部楼层
liaow10 发表于 2016-10-13 15:15
是的,如果使用浏览器输入地址,页面上就会显示这些。

看了你的截图,你得查一下是谁输出的这些字符串,一定是有人做了什么,CI 默认不会输出这些东西的。

本版积分规则