PHP之探索MySQL 长连接、连接池
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">php连接mysql的方式,用的多的是mysql扩展、mysqli扩展、pdo_mysql扩展,是官方<span style="color: black;">供给</span>的。php的运行机制是页面执行完会释放所有该php进程中的所有资源的,<span style="color: black;">倘若</span>有多个并发<span style="color: black;">拜访</span>本地的测试页面 <a style="color: black;"><span style="color: black;">http://</span><span style="color: black;">127.0.0.1/1.php</span></a><span style="color: black;">按照</span>php跟web服务器的<span style="color: black;">区别</span>,会开相应的线程或者进程去处理该请求,请求完了会释放结果的。<span style="color: black;">亦</span><span style="color: black;">便是</span>php<span style="color: black;">没</span>法从语言层面从页面到页面之间传递<span style="color: black;">有些</span>数据,<span style="color: black;">然则</span>mysql_pconnect跟pdo中的ATTR, 设置array(PDO::ATTR_PERSISTENT => true)如下是<span style="color: black;">能够</span>实现长连接的。</p>
<div style="color: black; text-align: left; margin-bottom: 10px;">$conn = new PDO($dsn, DB_USER, DB_PASSWORD,
array(PDO::ATTR_PERSISTENT => true)
);</div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">长连接的<span style="color: black;">功效</span>我觉得是在高负载的<span style="color: black;">状况</span>下,<span style="color: black;">经过</span>复用长连接,减少了<span style="color: black;">每一个</span>页面的<span style="color: black;">创立</span>数据库连接的时间,而这个<span style="color: black;">创立</span>mysql connection的时间,在我的<span style="color: black;">设备</span>上</p>在数据库connnections < 10的<span style="color: black;">状况</span>下 , mysql pdo <span style="color: black;">创立</span>connection time 为0.003ms, mysqli<span style="color: black;">创立</span>connection time为0.14ms在数据库connection接近满的时候,mysql pdo<span style="color: black;">创立</span>connection time为0.13ms, mysqli<span style="color: black;">创立</span>connection time为0.13ms<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">以上样本都是在大概估测时间,时间太小<span style="color: black;">欠好</span>估计。其实<span style="color: black;">创立</span>连接的时间并不长,那<span style="color: black;">这般</span><span style="color: black;">为何</span><span style="color: black;">必须</span>mysql长连接、连接池<span style="color: black;">这般</span>的东西呢。那是在高负载下,<span style="color: black;">例如</span>server单机<span style="color: black;">能够</span>接受的mysql并发在200<span style="color: black;">上下</span>,web server的单机并发在700<span style="color: black;">上下</span>,<span style="color: black;">那样</span>当大批量500并发连接压过来的时候, web server没到满负荷, mysql提前到了满负荷,就会<span style="color: black;">引起</span>所有页面<span style="color: black;">没</span>法响应、<span style="color: black;">或</span><span style="color: black;">已然</span><span style="color: black;">创立</span>好数据库连接的页面执行很慢。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">php中的mysql长连接<span style="color: black;">因为</span>php的运行方式有多种,因而长连接实现<span style="color: black;">亦</span>有多种。<span style="color: black;">必须</span>web服务器支持才<span style="color: black;">能够</span>实现长连接,<span style="color: black;">由于</span>php是<span style="color: black;">无</span>进程池跟连接池这种概念的,绝大<span style="color: black;">都数</span><span style="color: black;">状况</span>下php应用本身不是一个应用服务器(后起之秀swoole, 是一个优秀的php应用服务器,<span style="color: black;">不外</span>是在c层面做的)。因而php的长连接其实是搭载apache<span style="color: black;">这般</span>的带有mpm模块的webserver, linux 下apache会<span style="color: black;">守护</span>一个进程池,开启了apache mpm功能之后,apache会默认维持一个进程池,mysql长连接之后的连接,并<span style="color: black;">无</span><span style="color: black;">做为</span>socet连接关闭,而是<span style="color: black;">做为</span>一个不释放的东西,放进了进程池/线程池里面去。等<span style="color: black;">必须</span>连接的时,apache从它<span style="color: black;">守护</span>的进程池/线程池里面取出mysql socket connnection, <span style="color: black;">而后</span>就<span style="color: black;">能够</span>复用此连接了。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">这儿</span>测试一下,<span style="color: black;">首要</span>本机环境是archlinux , 后文所用mysql httpd php都是自己编译的源代码,都在/home/dengpan/opt目录。httpd的mpm模型<span style="color: black;">这儿</span>采用的是worker, httpd的mpm(apache用于并行方面功能的,俗<span style="color: black;">叫作</span>多路处理模块)其实有perfork、worker、event三种。mpm的好处是让apache随时有些备用的spare<span style="color: black;">或</span>空闲的子进程(服务器线程池),随时等待新过来的请求,<span style="color: black;">这般</span>客户端不<span style="color: black;">必须</span>在请求服务之前等待子进程的产生。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">运用</span>什么mpm,<span style="color: black;">必须</span>单独指定编译进去apache里面去,<span style="color: black;">例如</span>编译work mpm到apache里面去,<span style="color: black;">例如</span>我的最简化httpd的编译参数是</p>
<div style="color: black; text-align: left; margin-bottom: 10px;">./configure \
--with-apr=/home/dengpan/opt/apr-1.5.2 \
--with-apr-util=/home/dengpan/opt/apr-util-1.5.4 \
--prefix=/home/dengpan/opt/httpd-2.4.</div>
你的见解真是独到,让我受益匪浅。 i免费外链发布平台 http://www.fok120.com/ seo常来的论坛,希望我的网站快点收录。
页:
[1]