什么是长连接和短链接?
顾名思义,长连接相对短链接,长时间保持客户端和服务端的链接状态
短连接: 连接-》数据传输-》关闭连接;
长连接:连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接;
当然由于php没有连接池的概念,长连接也是有个时间限度的,对应的是数据库中的wait_timeout(默认是8小时),在一段时间没有操作数据库后,数据库会断掉这个连接。
PS:如何保持类似的永久连接呢,可以通过类似于socket通信中的心跳机制,不断的发送心跳包,保持和数据的连接。(因为数据库的timeout计时会在每次数据库访问重新开始计时)
分别在什么情况下使用?
1.长连接较短链接并没有什么特殊功能,唯一的是效率
当webserver连接sql(overhead高的原因有很多,比如数据库种类,数据库服务,服务器负载。。)的耗费较高时候,持久连接因为没有重新建立连接所以效率会更高。
2.有利也有弊,由于数据库连接数是有限的,比如数据库连接设置为100个,而apache访问最大数为200个时,当超过100个请求所有的请求都取访问数据库,如果使用长连接,之前的100个没有被释放掉的话,接下来的100个都会无法连接数据库,直到之前的数据库连接被复用或者释放,所以当并发访问量很大的时候就要考虑下是否采用长连接的方式了(前100个由于长连接可能是被占用状态,也可能是和后100个所请求的数据库不一致,导致无法被复用)
php的几个运行模式下的长连接
1.cgi,php用作单独的语言解释器,php 会为向 web 服务器提出的每个 PHP 页面请求生成并结束一个 PHP解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向SQL 数据库服务器的连接)都会随线程的结束而关闭。在这种情况下,使用持久连接和非持久连接没有任何区别——因为PHP脚本本身的执行不是持久的。
2.通常(我们系统),php用作web服务的一个模块,apache会加载php模块,一个请求过来,通常有父子两个进程协调处理的,子进程通常用作处理web页面的生成,父进程通常用于数据的写入,而数据库连接是建立在父进程里的,所以当子进程关闭的时候,并不会影响长连接的重用
3.与cgi类似,无法使用长连接
具体使用,测试
mysql_connect 短链接
mysql_pconnect 长连接
1.对于一些常驻进程,为什么不能使用this->load->model的方式去访问数据库
第一次连接数据库是可以访问的,但由于这个进程长时间没有访问数据库,超过了数据库设置的wait_timeout,数据库自动断开了此连接,下次常驻进程监听到消息,再去操作数据库的时候,就会报错。
解决方案:
可以通过自己手动关闭数据库连接,从而下次监听消息再次主动连接数据库
采用pconnect方式,并定时向数据库发送数据,保持数据库永久连接
2.测试后,mysql数据库连接的消耗并不是很大,所以绝大部分情况可以不使用长连接,避免产生数据库连接过多,因为当数据库连接快满的时候,产生新的连接的消耗,会明显增加。