由于PHP会在处理完一个请求之后会释放所有系统资源,从而会有很多人认为PHP不需要手动释放资源,释放资源的事PHP会做。正常来说,PHP处理一个请求所用的时间很少,请求到来到请求结束也就零点几秒的时间,手不手动释放资源影响不大。但是如果某个业务逻辑执行时间是秒级别,刚好此时高并发(2000个并发),那么mysql链接资源或者redis连接资源得不到释放,就会报连接数过多的错误了(通常mysql的最大连接数不超过2000,甚至更低)。还有就是PHP在后台跑脚本常驻内存的时候如果不手动释放资源同样会出现这种情况。
while (true)
{
//for循环模式100个连接
for($i=0;$i<100;$i++)
{
$link[$i] = mysqli_connect("127.0.0.1", "root", "root", "chat");
$link[$i]->query("show tables");
$r[$i] = new Redis();
$r[$i]->connect("127.0.0.1",6379);
}
//假设业务逻辑执行需要3秒
sleep(3);
}
查看mysql连接数
image.png
查看redis 的连接数
image.png
很明显,如果在高并发的情况下如果不手动释放资源,很容就会出现连接数过大的问题啦
加上手动释放资源对比
while (true)
{
for($i=0;$i<100;$i++)
{
$link[$i] = mysqli_connect("127.0.0.1", "root", "root", "chat");
$link[$i]->query("show tables");
$r[$i] = new Redis();
$r[$i]->connect("127.0.0.1",6379);
mysqli_close($link[$i]); //释放mysql连接
// $link[$i]->query("show tables"); //Warning: mysqli::query(): Couldn't fetch mysqli
$r[$i]->close(); //释放redis连接
$r[$i]->get("test_some"); //能正常获取值
}
sleep(3);
}
image.png
image.png