据说sqlite不支持高并发,在网上看到如果一条一条写入,如果数据多很慢,但是如果用事务就会很快。
我就想能不能让web延迟写入,2秒后写入2秒内的指令,一起进行事务。
研究了半天,终于搞定了,自己的代码分享一下。
需要使用Redis或Memcached缓存。
class MYDB extends SQLite3{
function __construct()
{
$this->open('gC5M.db');
}
}
function tocache() {
if (extension_loaded('redis')) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
return $redis;
}
if (class_exists('Memcached')) {
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
return $memcached;
}
return false;
}
function cha($sql){
$db=new MYDB();
$arr=getca('cache');
if(is_array($arr)&&is_int($arr[0])&&$arr[0]<time()){
$ret = $db->exec('BEGIN');
$c=count($arr);
for($i=1;$i<$c;$i++){
$ret = $db->exec($arr[$i]);
}
$ret = $db->exec('COMMIT');
setca('cache','');
}
$ret = $db->query($sql);
while($row = $ret->fetchArray(SQLITE3_ASSOC) ){
$tmp[]=$row;}
$db->close();
return $tmp;
}
function gai($sql,$y=''){
if(!empty($y)){
$db=new MYDB();
$ret = $db->exec($sql);
$tmp=$ret?'成功,'.$db->changes():0;
$db->close();
return $tmp;
}
$arr=getca('cache');
if(is_array($arr)&&is_int($arr[0])){
if(is_array($sql)){
$arr=array_merge($arr,$sql);
}
else{
$arr[]=$sql;
}
}
else{
$arr=[];
$arr[0]=time()+2;
if(is_array($sql)){
$arr=array_merge($arr,$sql);
}
else{
$arr[]=$sql;
}
}
setca('cache',$arr);
}
function setca($x,$y){
$mc = tocache();
if(!is_array($y)){
$tmp=[];
$tmp[0]=$y;
$y=$tmp;
}
$y=serialize($y);
$mc->set($x, $y,mt_rand(300,600));
}
function getca($x){
$mc = tocache();
$tmp=$mc->get($x);
$tmp=unserialize($tmp);
return $tmp;
}
gai('指令');
//gai()是增删改
//cha()是查询
//增删改时写入缓存,带参数的直接执行
//在查询里时间到了写入,因为查询比增删改频繁