最近做一个活动是基于微信端的,需获取微信信息(openid、昵称、头像),是以抢奖品的形式做的,每次参与的人数在2000人左右。每次都会出现一个问题,每次参与活动的人数一多就出现数据库连接不上的情况,我自己在服务器上本地连接数据库都连不上,查看服务器CPU、内存使用情况都不是很高
首页的逻辑代码如下:
include_once 'config/common.php';       //  提示信息
include_once 'config/weixin.php';           //  微信接口
include_once 'config/databases.php';     // 数据库
// 实例化微信操作
$wx = Wxin::getInstance();
// 只能在微信内置浏览器中打开
if(!$wx->is_weixin()){
hint("请在微信中打开该页面");
exit;
}
// 实例数据库操作
$mysql = Mysql::getInstance();
// 微信
$code = isset($_REQUEST['code']) ? $_REQUEST['code'] : 0;
$state = isset($_REQUEST['state']) ? $_REQUEST['state'] : 0;
$id = '';
 // 判断是否需要获取用户信息
if($code != 0){
$list = $wx->getOpenid($code);
if($list->openid){
$week = date("W",time());
$sql = "select id from commune_user where openid='{$list->openid}' and week=".$week;
$val = $mysql->getRow($sql);
if(empty($val)){
$value = $wx->getInfor($list->access_token,$list->openid);
$nickname = base64_encode($value['nickname']);
$sql = "insert into commune_user(openid,nickName,headImg,week) values('".$value['openid']."','".$nickname."','".$value['headimgurl']."',{$week})";
$id = $mysql->insert($sql);
}else{
$id = $val['id'];
}
$_SESSION['openid'] = $list->openid;
}else{
$url = $wx->skip('http://www.95omno.com/CYZY/commune/index.php');
header("location:$url");
exit;
}
}
// 如果session不存在则需要重新获取用户信息
if($_SESSION['openid'] == ''){
$url = $wx->skip('http://www.95omno.com/CYZY/commune/index.php');
header("location:$url");
exit;
}
// 判断用户ID
if($id == ''){
$week = date("W",time());
$sql = "select id from commune_user where openid='".$_SESSION['openid']."' and week=".$week;
$temp = $mysql->getRow($sql);
if(empty($temp)){
$url = $wx->skip('http://www.95omno.com/CYZY/commune/index.php');
header("location:$url");
exit;
}else{
$id = $temp['id'];
}
}
数据库连接的代码如下:
class Mysql{
//保存类实例的静态成员变量
private static $_instance;
// ip地址
private static $_host = '127.0.0.1:3306';
// 用户名
private static $_user = '';
// 密码
private static $_pwd = ‘';
// 数据库名称
private static $_name = '';

/**
 * 私有的构造方法,防止被直接实例化ss
 */
private function __construct(){}
/**
 * 单例方法,用于访问实例的公共的静态方法
 */
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self();
}
return self::$_instance;
}
/**
 * 创建__clone方法防止对象被复制克隆
 */
public function __clone(){}
/**
 * 数据库连接
 */
private function link(){
$connectLink = mysql_connect(self::$_host,self::$_user,self::$_pwd) or die("<div style='width:80%;margin-left:10%;font-weight:bold;margin-top:100px;text-align:center;'><br/>如长时间无反应,请退出重新进入!</div>");
mysql_select_db(self::$_name,$connectLink) or die("<div style='width:80%;margin-left:10%;font-weight:bold;margin-top:100px;text-align:center;'>br/>如长时间无反应,请退出重新进入!</div>");
mysql_query("set names utf8",$connectLink);
return $connectLink;
}
/**
 * 执行SQL语句
 */
public function getInfo($sql){
$connectLink = $this->link();
$val = mysql_query($sql);
$lists = array();
while($row = mysql_fetch_assoc($val)){
$lists[] = $row;
}
mysql_free_result($val);
mysql_close($connectLink);
    return $lists;
}
/**
 * 获取一行信息
 */
public function getRow($sql){
$connectLink = $this->link();
$val = mysql_query($sql);
$row = mysql_fetch_assoc($val);
mysql_free_result($val);
    mysql_close($connectLink);
    return $row;
}
/**
 * 执行插入信息SQL
 */
public function insert($sql){
$connectLink = $this->link();
$is = mysql_query($sql);
$id = mysql_insert_id();
mysql_close($connectLink);
if($is){
return $id;
}else{
return false;
}
}
/**
 * 执行SQL语句
 */
public function query($sql){
$connectLink = $this->link();
$is = mysql_query($sql);
mysql_close($connectLink);
return $is;
}
}
请大神帮忙看下是什么原因?

解决方案 »

  1.   

    人多才出现的问题,可能是的mysql配置问题
    看配置文件中 max_connections 的值 ,若是没有,默认好像是 200,可适当调大
      

  2.   

    查看一下mysql的链接数是多少,然后每次查询、操作后,是否有断开连接等。
      

  3.   

    用PDO试试
      

  4.   

    1、把 '127.0.0.1:3306' 改为 'localhost:3306',连接速度会快一点
    2、你在每次查询之后都关闭 mysql 连接,这是不妥当的
          程序中有多次查询,每次都重新连接的话可能会使工作中途夭折
          不在中途关闭连接,至少可以使已经连上的可以连续工作