發新話題

[分享] 用php實現mysql空間分配的代碼

用php實現mysql空間分配的代碼

請先備份好mysql庫或註釋掉revoke()內容再試,類沒提供恢復方法

程序說明 :
1.監視登陸的所有庫
$mysql = new Mysql('localhost','root','','db');
...
$o = new DbQuota($mysql);
$o->action();
...
2.監視某些表
如mysql表:$o = new DbQuota($mysql、'mysql');
某幾個表: $o = new DbQuota($mysql、array('mysql'、'discuz'、'test'));
...
3.想看看執行效果

$o = new DbQuota($mysql);
$o->action();
//將返回一個超過限制的列表(print_r)
$o->getWarnedDbList();
4.預先通知如(90%的時候通知)
在action裡改,一看就明白了
5.英文不好,變量名誰給改改,資料庫類是可以用discuz的
6.其它如恢復權限沒寫,自行增加,改好了給我發一個吧,最近要寫很多東西
7.缺點,不能及時反應空間情況,是事後補救型的,只能說是一個方法而已
還有很多很多


資料表說明
1.表結構:
CREATE TABLE `quota` (
`db` varchar(64) NOT NULL default '',
`host` varchar(60) NOT NULL default '',
`user` varchar(16) NOT NULL default '',
`email` varchar(50) NOT NULL default '',
`maxTblNum` smallint(5) unsigned NOT NULL default '0',
`maxDbSize` float(5,2) NOT NULL default '0.00',
`curTblNum` smallint(5) unsigned NOT NULL default '0',
`curDbSize` float(5,2) NOT NULL default '0.00',
`isVip` enum('N','Y') NOT NULL default 'N',
`warnedTime` char(1) NOT NULL default '0',
`isDeleted` enum('N','Y') NOT NULL default 'N',
PRIMARY KEY (`db`)
) TYPE=MyISAM;
host--------主機
maxTblNum---最大允許建表數
maxDbSize---最大允許庫容量
curTblNum---當前大小(用於後台瀏覽模式)
curDbSize---...
isVip-------特殊用戶不限制
warnedTime----警告次數,超過一定次數不處理的根據此字段刪除庫
isDeleted---刪除庫標誌
2.沒有初始資料的話可以從mysql.db,mysql.user查詢得到(過濾掉mysql,test,及不想監視的庫)
一個查詢就可以了
3.冗餘字段問題如host,及user跟db同名的可自行設計,其它按需要增減的字段

<?php
/**
+---------------------------------------------------------------+
| Date: 2005-09-13 |
| Name: $this->dbquota.class.php |
| ============================================================= |
| QQ: 107197046 |
| Email: phpxsir@gmail.com |
| Author: 路過(go-by) |
+---------------------------------------------------------------+
**/

class DbQuota {
//資料庫對像
var $mDB;
//庫列表
var $mDbList = array();
//超過限額列表
var $mWarnedDbList =array();

function __construct($obj、$db = NULL) {
$this->mDB = $obj;
$this->setDbList($db);
}

function DbQuota($obj、$db=NULL) {
$this->__construct($obj、$db);
}

function setDbList($dbs = NULL) {
if (isset($dbs)) {
$dbs = is_array($dbs) ? implode("'、'"、$dbs) : $dbs;

$cond = sprintf("WHERE `db` in('%s')"、$dbs);
} else {
$cond = "where 1";
}

$sql = sprintf("SELECT `db`、`user`、`host`、`email`、`maxDbSize`、`maxTblNum`、`isVip`、`warnedTime`
FROM `quota` %s"、$cond);
$qry_db_info = $this->mDB->query($sql);

$dbList = array();

while ($arr = $this->mDB->fetch_array($qry_db_info)) {
$dbList[$arr['db']] = $arr;
}

$this->mDBList = $dbList;
return true;
}

function action() {

foreach ($this->mDBList as $db=>$info) {

$sql = sprintf("SHOW TABLE STATUS FROM `%s`"、$db);
$qry_status = $this->mDB->query($sql);

$curDbSize = 0;

//沒有表,返回
if(!($curTblNum = $this->mDB->num_rows($qry_status))) continue;

while ($arr = $this->mDB->fetch_array($qry_status)) {
$curDbSize += $arr['Data_length'] + $arr['Index_length'];
}

$this->mDB->free_result($qry_status);

$curDbSize = number_format($curDbSize/1024/1024、2);//按兆計

$this->updateDbInfo($db、$curTblNum、$curDbSize);

//取消權限,要增加提前(如在90%的時候)通知,請在此改
if (($curTblNum > $info['maxTblNum'] || $curDbSize > $info['maxDbSize']) && $info['isVip'] == 'N') {
if($info['warnedTime']) {//有警告記錄,可用於多次警告不理時,禁用該用戶,具體參數自己調
$this->updatewarnedTime($db);
//$this->clear();
//$this->sayGoodbye();
} else {//初犯
$this->revoke($db);
$this->mailWarn($info['email']);
$this->updateWarnedTime($db);
}
$this->mWarnedDbList[] = $db;
}
}
}


//更新記錄
function updateDbInfo($db、$num、$size) {
$sql = sprintf("UPDATE `quota` SET `curTblNum`='%s'、`curDbSize`='%s' WHERE `db`='%s' LIMIT 1"、$num、$size、$db);
$this->mDB->query($sql);
}

function updateWarnedTime($db) {
$sql = sprintf("UPDATE `quota` SET `warnedTime`=`warnedTime`+1 WHERE `db`='%s'"、$db);
$this->mDB->query($sql);
}

//取消權限
function revoke($db) {
$sql = sprintf("REVOKE INSERT ,UPDATE ,CREATE ON `%s`.* FROM '%s'@'%s'"、
$this->mDBList[$db]['db']、
$this->mDBList[$db]['user'],
$this->mDBList[$db]['host']);
$this->mDB->query($sql);

}

function mailWarn($email) {
//@mail();
//做能通知到用戶的事,如列印出來,然後電話通知^_^
}

function getWarnedDbList() {
if(count($dbs = $this->mWarnedDbList) == 0) {
echo "No database exceeds quota!";
return;
}

$cond = sprintf("WHERE `db` in('%s')"、implode("'、'"、$dbs));

$sql = sprintf("SELECT * FROM `quota` %s"、$cond);
$qry = $this->mDB->query($sql);//

$dbl = array();
while ($arr = $this->mDB->fetch_array($qry)) {
$dbl[$arr['db']] = $arr;
}

$this->mDB->free_result($qry);
print_r($dbl);
}

function clear($db) {
$sql = "DROP DATABASE IF EXISTS `{$db}`";
//$this->mDB->query($sql);
$sql = "UPDATE `quota` SET `isDeleted`='Y' WHERE `db`='{$db}`";
//$this->mDB->query($sql);
}
}
?>

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。