font
论坛元老
 
初级会员
UID 43400
精华
0
积分 36461
帖子 260
金钱 36461 喜悦币
威望 0
人脉 0
阅读权限 90
注册 2004-11-1
状态 离线
|
刚写的SQLRELAY的类(连接池)
在PHP下使用C的连接池(SQLRELAY),扩展了PHPBB3的DB类.让他支持SQLRELAY.
我在FEDORA CORA6下测试通过.
<?php
//封装sqlrelay
//author:小陶风
if (!defined('SQL_LAYER'))
{
define('SQL_LAYER', 'sqlrelay');
include(ROOT_PATH . 'model/classes/db/dbal' . $phpEx);
class dbal_sqlrelay extends dbal
{
/*
* sql_connection连接方式
*
*
*/
var $rownum = 0;
var $cursor;
var $con = '';
function sql_connect($sqlserver, $sqluser, $sqlpassword, $database, $port = false, $persistency = false)
{
global $sqlrelay_socket,$sqlrelay_retrytime,$sqlrelay_tries;
$this->persistency = $persistency;//是否是持久连接
$this->user = $sqluser;//用户名
$this->server = $sqlserver;//用户地址
$this->dbname = $database;//数据库名
//sqlrcon_alloc(string server, int port, string socket, string user, string password, int retrytime重试时间, int tries重试次数)
$this->db_connect_id = sqlrcon_alloc($this->server,$port,$sqlrelay_socket,$this->user,$sqlpassword,$sqlrelay_retrytime,$sqlrelay_tries);
return $this->_sql_error('');
}// end sql_connect
//事务,要他干啥
function sql_transaction($status = 'begin')
{
//
}//end sql_transaction
//数据库查询
function sql_query($query = '', $cache_ttl = 0)//$cache_ttl是否使用cache,默认是不使用
{
global $sqlrelay_socket,$sqlrelay_retrytime,$sqlrelay_tries;
if ($query != '')
{
//echo $query;
global $cache;
if (defined('DEBUG_EXTRA'))//如果是DEBUG,则显示REPORT
{
$this->sql_report('start', $query);
}
//$this->query_result = ($cache_ttl && method_exists($cache, 'sql_load')) ? $cache->sql_load($query) : false;//cache loading...所有的cache全部封装在这里
//if (!$this->query_result)
if (1)
{
//如果cache查询结果不存在
$this->num_queries++;//统计查询次数
$this->cursor = sqlrcur_alloc($this->db_connect_id);
//sqlrcur_setResultSetBufferSize($this->cursor,100);//设置sqlrelay的缓存
if (($this->query_result = sqlrcur_sendQuery($this->cursor,$query)) === false)
{
$this->sql_error($query);//自己定义错误
//sqlrcur_errorMessage($this->db_connection_id);//也可以使用这个,sqlrelay自己的出错信息
}
}
else if (defined('DEBUG_EXTRA'))
{
$this->sql_report('fromcache', $query);
}
}
else
{
return false;
}
return ($this->query_result) ? $this->query_result : false;
}//end sql_query
//这个要它干啥
function sql_query_limit($query, $total, $offset = 0, $cache_ttl = 0)
{
if ($query != '')
{
$this->query_result = false;
// if $total is set to 0 we do not want to limit the number of rows
if ($total == 0)
{
$total = -1;
}
$query .= "\n LIMIT " . ((!empty($offset)) ? $offset . ', ' . $total : $total);
return $this->sql_query($query, $cache_ttl);
}
else
{
return false;
}
}
//返回结果集中的数目
function sql_numrows($query_id = false)
{
if (!$query_id)
{
$query_id = $this->query_result;
}
return ($query_id) ? @sqlrcur_rowCount($query_id) : false;
}
//返回影响行数
function sql_affectedrows()
{
return ($this->db_connect_id) ? sqlrcur_affectedRows($this->db_connect_id) : false;
}
//获取当前行
function sql_fetchrow($query_id = false)
{
global $cache;
if (!$query_id)
{
$query_id = $this->cursor;
}
/*
if (isset($cache->sql_rowset[$query_id]))
{
return $cache->sql_fetchrow($query_id);
}
*/
$arr = sqlrcur_getRowAssoc($this->cursor,$this->rownum);
$this->rownum++;
return ($query_id) ? $arr : false;
}
//返回指定单元的内容
function sql_fetchfield($field, $rownum = false, $query_id = false)
{
//要它干啥
}
function sql_nextid()//获取NEXTID
{
return ($this->db_connect_id) ? sqlrcur_getResultSetId($this->cursor) : false;
}
function sql_freeresult()
{
sqlrcur_free($this->cursor);
}
function _sql_close()
{
return sqlrcon_free($this->db_connect_id);
}
function _sql_error()
{
return array(
'message' => @mysql_error(),
'code' => @mysql_errno()
);
}
/**
*
*/
function _sql_report($mode, $query = '')
{
switch ($mode)
{
case 'start':
$explain_query = $query;
if (preg_match('/UPDATE ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
{
$explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
}
else if (preg_match('/DELETE FROM ([a-z0-9_]+).*?WHERE(.*)/s', $query, $m))
{
$explain_query = 'SELECT * FROM ' . $m[1] . ' WHERE ' . $m[2];
}
if (preg_match('/^SELECT/', $explain_query))
{
$html_table = false;
if ($result = @mysql_query("EXPLAIN $explain_query", $this->db_connect_id))
{
while ($row = @mysql_fetch_assoc($result))
{
$html_table = $this->sql_report('add_select_row', $query, $html_table, $row);
}
}
@mysql_free_result($result);
if ($html_table)
{
$this->html_hold .= '</table>';
}
}
break;
case 'fromcache':
$endtime = explode(' ', microtime());
$endtime = $endtime[0] + $endtime[1];
$result = @mysql_query($query, $this->db_connect_id);
while ($void = @mysql_fetch_assoc($result))
{
// Take the time spent on parsing rows into account
}
@mysql_free_result($result);
$splittime = explode(' ', microtime());
$splittime = $splittime[0] + $splittime[1];
$this->sql_report('record_fromcache', $query, $endtime, $splittime);
break;
}
}
}//end class
}
?>
|  我木有积分我木有 金钱我木有喜悦币我木有威望我木有人脉我木有头衔 |
|