$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis->set('test','check');
$redis->close();
var_dump($redis->get('test')); ## 这里依然能打印没有报错
exit();
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis->set('test','check');
$redis->close();
var_dump($redis->get('test')); ## 这里依然能打印没有报错
exit();
$redis->close()
并没有真正的释放资源,然后关闭链接,只是做了一个标记。在 PHP 的语言特性中 GC ( 垃圾回收)并不重要,反正一个 HTTP 请求周期结束之后会统一回收资源。
可以对比一下下面代码的效果:
gc_enable();//开启 gc 自动回收
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis->set('test','check');
$redis->close();
gc_collect_cycles();//执行一次回收周期
var_dump($redis->get('test')); ## 这里依然能打印没有报错
exit();
抱歉我并没有自己验证过效果
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
1 回答1.9k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
因为
$redis->get()
的时候自动重新连接了。用 strace 跟踪执行:
从源码来看,get 方法是通过 REDIS_PROCESS_KW_CMD 实现的,其中的 redis_sock_get 会调用 redis_sock_server_open 打开新连接。