PHP没有数据库连接池怎么破?PHP环境下使用Nginx ngx

线上运行了一套辅助系统是利用了开源的PHP改的,之前也没怎么玩过PHP,没想到这玩意儿还是有不少坑的。突然某一天一个用户做线上活动推广,然后短时间内涌进来了上万的请求,然后数据库连接耗尽,短时间内几乎拖垮了整个系统。导致系统奔溃的有多方面原因,今天主要针对PHP没有数据库连接池的原因来分析。

在PHP里,数据库连接在请求到达时建立,请求结束时释放。如果同时几千个请求到达,那就同时会建立几千个数据库连接,非常恐怖。而且PHP木有比较好的数据库连接池驱动方案,所以我们得另想办法。

解决这种问题有三种办法:
1.使用Mysql Proxy中间件。Mysql Proxy提供了连接池管理的功能。但是我们没有采用此方法,因为情况紧急,没有人熟悉这玩意儿。
2.使用PHP-FPM。PHP-FPM是PHP的一个FastCGI进程管理器。通过配置可以控制同时处理PHP请求的进程数。
具体可以参考:http://www.linuxde.net/2013/06/14638.html
但是我们也没用使用此方案,因为安装配置过程比较麻烦。
3.使用Nginx的ngx_http_limit_req_module来控制请求。
此模块可以通过自定义的键值来限制请求频率。限制的方法就像漏斗,每秒固定处理请求数,然后推迟超出的请求,最后超出最大值的直接503返回拒绝。
我们使用了此方案,是因为只需简单配置,而且可以灵活控制限制请求的场景。例如,对于静态资源的请求我们不做限制,而对于PHP的请求做限制。还可以从URL地址里提取出变量信息作为键,来达到更细的请求限制。
下面贴部分我们的配置给大家讲解下。

http {
    ......
    limit_req_zone $limit_key zone=limit_one:50m rate=30r/s;
    #定义limit_key为Key的变量名,用于后面赋值,每个Key都有自己的计数器。limit_one为zone的名称。rate表示每秒最多接受30个同时请求。
    server {
        ......
        if ( $request_uri ~* .*php.* ) {
              set $mp_limit_key $binary_remote_addr;
              #对于全部PHP首先有个默认的Key,使用客户端的IP作为Key。相当于每个客户端IP都会在zone的限制内。
         }
        if ( $query_string ~* .*id/(d+).php.* ) {
              set $mp_limit_key $1;
              #提取id后面的值作为Key。
        }
        if ( $query_string ~* .*appid/wx(.*).html.* ) {
              set $mp_limit_key $1;
              #提取appid作为Key。
        }
        limit_req zone=limit_one burst=200;
        #限制limit_one在此server内的漏斗容量为200。假设一个Key对应的请求数为200,那么第一秒内在处理的为30个请求,其余的170个请求在等待排队。假设一个Key对应的请求数为300,那么超出200的部分将直接返回503。
        .......
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, php
, key
, 配置
, 同时
, 请求php
, 限制
, nginx线程池
, limit_req
, Nginx限制爬虫频率
URI.php
ngx.var nginx变量、nginx lua ngx.log、nginx lua ngx.var、nginx ngx req status、nginx ngx lua,以便于您获取更多的相关知识。

时间: 2016-07-26

PHP没有数据库连接池怎么破?PHP环境下使用Nginx ngx的相关文章

纯静态文件环境下的Nginx优化思路

Nginx以其消耗资源少,承受并发量大,配置文件简洁等特点,深受广大sa们的喜欢,但是网上传播的nginx 配置并没有对做过多的优化.那么接下来,我就从某大型媒体网站的实际运维nginx优化角度,来给大家讲解一下nginx主要优化的那些方面. 一.编译方面优化 1.首先就要从configure 参数分析,根据网上最常用的configure 参数来说,大都是 ./configure --prefix=/usr/local/nginx --user=www --group=www  --with-h

详解Linux环境下使Nginx服务器支持中文url的配置流程_nginx

1:确定你的系统是UTF编码 [root@Tserver ~]# env|grep LANG LANG=en_US.UTF-8 2:NGINX配置文件里默认编码设置为utf-8 server { listen 80; server_name .inginx.com ; index index.html index.htm index.php; root /usr/local/nginx/html/inginx.com; charset utf-8; } 如果是用securecrt 上传文件,请选

CentOs环境下安装Nginx

一:准备工作     1.GCC和Make        安装Linux系统的时候一般会带着这两个,如果你不知道有没有的话可以用这个命令.当有的话,它会更新,如果没有它会重新安装         yum -y install gcc gcc-c++ make     2.Nginx的一些模块需要第三方库的支持, 如rewrite模块需要pcre库,gzip模块需要zlib模块,ssl功能你需要openssl库等.用户可通过yum命令安装这些依赖库:         yum -y install

linux-Linux环境下自己实现myshell

问题描述 Linux环境下自己实现myshell 内容不要太复杂,适合初次写这个的难度就好,实现ls pwd cp l 等功能 解决方案 在linux环境下实现定时计划任务linux环境下通过nginx实现tomcat集群实现Session会话问题linux环境下nat程序的实现---------------------- 解决方案二: http://www.pudn.com/downloads151/sourcecode/unix_linux/detail652959.html 解决方案三:

基于JDBC的数据库连接池技术研究与应用

数据|数据库|数据库连接 摘 要 本文介绍了Java访问数据库的原理及其存在的问题,提出了解决办法-数据库连接池,并对其关键问题进行了分析,构建了一个简便易用的连接池并结合当前热门技术Servlet说明了其如何在开发时使用. 关键词 JDBC,Jsp/Servlet,数据库连接池,多数据库服务器和多用户,多线程 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server

Tomcat4.1.31的数据库连接池配置

数据|数据库|数据库连接 (摘自JAVA中文站) 本文是作者在配置廖兄的blog时用到的,刚开始使用Tomcat5.0.27,后又使用Tomcat5.5.4,但是配置数据库总有错误,后来发现时context标志被取消的缘故.吾本性情中人,搞不定就换,于是就使用Tomcat4.1.31.主要参考FanyHan等人的相关文章,介绍了Tomcat4.1.31这个版本下数据库连接池的配置,及程序对连接池的JNDI查找,并提供相应测试代码.最后指出配置及应用过程中的常见问题及解决方法. 一. Tomcat

基于JDBC的数据库连接池技术研究与设计

设计|数据|数据库|数据库连接 摘 要 本文介绍了基于JDBC的数据库连接池的工作原理,阐述了连接池技术的事务处理.多数据库服务器等各项关键技术,提出了一个高效的连接池管理策略,最后详细说明了数据库连接池应用的具体实现过程. 关键词 JDBC; 数据库; 连接池; 事务处理 随着信息技术的高速发展与广泛应用,数据库技术在信息技术领域中的位置越来越重要,尤其是网络应用和电子商务的迅速发展,都需要数据库技术支持动态Web站点的运行,而传统的开发模式是:首先在主程序(如Servlet.Beans)中建

Tomcat 5.5 配置 MySQL 数据库连接池

mysql|数据|数据库|数据库连接 用了最新的几个咚咚,搞了整整一天终于搞清楚了Tomcat 5.5 配置 MySQL 数据库连接池,网上的经验并不能完全用到新环境里面,我写出整个过程以方便大家配置. 1 环境描述 JDK 1.5 Tomcat 5.5.4 MySQL 4.0.20 MySQL JDBC 3.0.15 Commons dbcp 1.2.1 2 准备工作 JDK, Tomcat, MySQL安装过程并非我的重点,略过. 从http://dev.mysql.com/download

java中自定义数据库连接池

连接池是非常好的想法,应用很普遍.自己写一个数据库连接池,并不像想象中那样困难.一般系统对连接池的功能不会有太多要求,使用自己的连接池未必是个坏主意.下面以Oracle为例,但是对Teradata和Greenplum也是可行的.另外我还实现了连接有效性检查(checkConn)和恢复连接(resetConn)的方法.本例编程采用的是JRE1.4.2环境(别忘了准备访问数据库的jar包).有任何问题请随时留言,欢迎探讨. 在Oracle内创建测试数据: drop table my_table; c