免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19975 | 回复: 84
打印 上一主题 下一主题

致命问题,致命打击 ,大虾进来看下,在线等......... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-27 10:20 |只看该作者 |倒序浏览
测试机器和服务器都是 rhel3 au4
mysql : 4.1.18 编译安装
php4.44 编译安装

在测试机器上我的程序一直都好好的
但是在服务器上出现
on file /***/***/classes.php
on line 52
eno:1040
emsg:Too many connections

我的/etc/my.cnf

26 [mysqld]
     27 port            = 3306
     28 socket          = /tmp/mysql.sock
     29 skip-locking
     30 key_buffer = 16M
     31 max_allowed_packet = 50M
     32 table_cache = 64
     33 sort_buffer_size = 512K
     34 net_buffer_length = 8K
     35 read_buffer_size = 256K
     36 read_rnd_buffer_size = 512K
     37 myisam_sort_buffer_size = 8M
     38 max_connections = 1000


我的classes.php 中相关成员函数
<?
/*--------------------------------------------------
|                                数据驱动类
*--------------------------------------------------*/
class db_driver
{
  var $options = array(
          "db_dbname" => "",                          //数据库名
        "db_username" => "****",                //数据库用户名
        "db_passwd" => "******",                //数据库密码
        "db_host"   => "*******:3306",                 //服务器
        "persistent" => 1,                        //持久化连接
        "debug"        => 1,                                 //调试标志
       
  );
  var $conn;                 //数据库连接
  var $stmt;                  //数据库语句声明标志
  var $eno;                //错误编号
  var $emsg;                 //错误信息
  /*
  function db_driver(&$options)
  {
          $this->__construct($options);
  }
*/
  function db_driver(&$options)
  {
             if(is_array($options))
        {
                $this->set_options($options);
                $this->connect();
                $this->select_db();
        }
  }
  function set_options(&$options)
  {
          if(is_array($options))
        foreach($options as $key => $var){
                $this->options[$key] = $var;
                $options[$key] = $key;
        }
  }
  function connect()
  {
          if($this->options["db_dbname"]){
                if($this->options["persistent"]){
                        $this->conn = @mysql_pconnect($this->options['db_host'],$this->options["db_username"], $this->options["db_passwd"]);
                }else{
                        $this->conn = mysql_connect($this->option['db_host'],$this->options["db_username"],  $this->options["db_passwd"]);
                }
        }
        //print_r($this->conn);
        //die();
        if(!$this->conn) $this->set_error(__LINE__);
        return $this->conn;
  }

现在我不知道是程序还是服务器配置的问题
在测试机器上没有出现以上错误,初步估计是mysql 的问题吧,大虾们看一下,非常感谢!!

论坛徽章:
0
2 [报告]
发表于 2006-04-27 10:42 |只看该作者
MYSQL连接数过多,与PHP无关.修改一下MYSQL的配置,

论坛徽章:
0
3 [报告]
发表于 2006-04-27 10:47 |只看该作者
原帖由 ipaddr 于 2006-4-27 10:42 发表
MYSQL连接数过多,与PHP无关.修改一下MYSQL的配置,

老大,我已经加入这句啦,还要如何配置啊

max_connections = 1000

论坛徽章:
0
4 [报告]
发表于 2006-04-27 10:54 |只看该作者
加入这句,还会说连接数过多吗?

你主机上有多少人在用MYSQL?

建议试试不用PCONNECT看看.

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-04-27 10:54 |只看该作者
别用mysql_pconnect, 没什么用处

论坛徽章:
0
6 [报告]
发表于 2006-04-27 10:56 |只看该作者
原帖由 北京野狼 于 2006-4-27 10:54 发表
别用mysql_pconnect, 没什么用处

是mysql_pconnetct 的问题么????

论坛徽章:
0
7 [报告]
发表于 2006-04-27 10:56 |只看该作者
原帖由 北京野狼 于 2006-4-27 10:54 发表
别用mysql_pconnect, 没什么用处



为啥说这PCONNECT没用处?

我测度过,性能提升很明显.

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2006-04-27 11:06 |只看该作者

数据库永久连接

  1. 数据库永久连接
  2. 永久的数据库连接是指在您的脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

  3. 对 WEB 服务器的工作和分布负载没有完全理解的读者可能会错误地理解永久连接的作用。特别的,永久连接不会在相同的连接上为您提供建立“用户会话”的能力,也不提供有效建立事务的能力。实际上,从严格意义上来讲,永久连接不会给您提供任何非永久连接无法提供的特殊功能。

  4. 为什么?

  5. 这和 WEB 服务器工作的方式有关。您的 WEB 服务器可以用三种方法来利用 PHP 生成 WEB 页面。

  6. 第一种方法是将 PHP 用作一个“外壳”。以这种方法运行,PHP 会为向您的 WEB 服务器提出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向 SQL 数据库服务器的连接)都会随线程的结束而关闭。在这种情况下,您使用永久连接不会获得任何地改变――因为它们根本不是永久的。

  7. 第二,也是最常用的方法,是把 PHP 用作多过程 WEB 服务器的一个模块,这种方法目前只适用于 Apache。对于一个多过程的服务器,其典型特征是有一个父过程和一组子过程协调运行,其中实际生成 WEB 页面的是子过程。每当客户端向父过程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子过程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子过程来处理。在开启了一个永久连接后,所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL Server 连接。

  8. 最后一种方法是将 PHP 用作多线程 WEB 服务器的一个插件。目前 PHP 4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这些使得 PHP 可以被用作诸如 Netscape FastTrack (iPlanet)、Microsoft's Internet Information Server (IIS) 和 O'Reilly's WebSite Pro 等多线程 WEB 服务器的插件。永久连接的行为和前面所描述的多过程模型在本质上是相同的。注意 PHP 3 不支持 SAPI。

  9. 如果永久连接并没有任何附加的功能,那么我们使用它有什么好处?

  10. 答案非常简单――效率。当客户端对您的 SQL 服务器的连接请求非常频繁时,永久连接将更加高效。连接请求频繁的标准取决于很多因素。例如,数据库的种类,数据库服务和 WEB 服务是否在同一台服务器上,SQL 服务器如何加载负载等。但我们至少知道,当连接请求很频繁时,永久连接将显著的提高效率。它使得每个子过程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。这也就是说,每个子过程将对服务器建立各自独立的永久连接。例如,如果您有 20 个不同的子过程运行某脚本建立了永久的 SQL 服务器永久连接,那么实际上您向该 SQL 服务器建立了 20 个不同的永久连接,每个过程占有一个。

  11. 注意,如果永久连接的子过程数目超过了您设定的数据库连接数限制,系统将会产生一些缺陷。如果您的数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在您的脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速的受到影响。请查阅您使用的数据库的文档,以获取关于如何处理已放弃的及闲置的连接的方法。
复制代码

[ 本帖最后由 北京野狼 于 2006-4-27 11:09 编辑 ]

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2006-04-27 11:10 |只看该作者
警告

  1. 在使用永久连接时还有一些特别的问题需要注意。例如在永久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被永久的阻塞,使得您需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,您都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者滚回事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用永久连接,这可以从根本上解决这个问题(当然您也可以在其它地方使用永久连接)。
复制代码



以下是一点重要的总结。永久连接是为通常连接建立一对一的分布而设计的。这意味着您必须能够保证在将永久连接替换为非永久连接时,您脚本的行为不会改变。使用永久连接将(非常)有可能改变您脚本的效率,但不改变其行为!

论坛徽章:
0
10 [报告]
发表于 2006-04-27 11:17 |只看该作者
建立数据库连接的开销很大,使 用PCONNECT是能明显提升性能的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP