Heim php教程 php手册 改进的PHP文本数据库类

改进的PHP文本数据库类

Jun 21, 2016 am 09:05 AM
gt nbsp this

数据|数据库

找了些时间,改进了自己文本数据库系统,从空间利用效率和并发性能两个方面着手,搞高了程序性能。

在空间利用率上,做了两点改进,一是在删除记录的时候,如果记录的存放位置在数据库的末端,就自动修改数据库末端指针,而不是将此记录的空间作为一个闲置块存入闲置块记录中,这样就可以继续在数据文件尾分配任意长度的空间而不是像以前那样将这个删除记录的空间整块分配给下一次请求空间的新记录;第二点改进是在从闲置块中请求空间的时候,不仅继续采用原来的最佳适应法,而且在请求到合适的闲置块的时候并不是将整个块而是将其部分划分给新记录,这样又进一部提高了空间的利用率。

在并发性能上,增加了数据库的打开模式这个选项。为了保持文本数据库操作的原子性,以前都以写模式打开数据库,用户无论是从数据库中读数据或写数据,系统都会锁定数据库而禁止其它用户并发的读写操作,而大多情况下,用户都是浏览网页而不是POST数据,禁止对数据库的并行的读操作,势必成为网页浏览速度的瓶颈,为了加速网页生成速度,在数据库中加入了打开模式这一选项,在只读模式下,可以允许不同的用户并发地从数据库中申请数据,使得网页并发性能得到了一定程序上的提高。

下面给出新文本数据库类的部分代码,其相关注释可以从原来的文章:http://202.113.13.169/site/redboy/index.php?item=read&id=1&blogID=4中获得。

源代码:


class TxtDB
{
    var $name='';//文本数据库名
    var $path='';
    var $minLen=20;
    var $isError;
    var $dbh;
    var $indxh;
    var $lfth;
    var $lckh;
    var $rcdCnt=0;
    var $maxID=0;
    var $leftCnt=0;
    var $DBend=0;
    var $mod='w';

    function TxtDB($name,$mod='w',$path='bpns_dbm')
    {
        $this->name=$name;
        $this->path=$path.'/'.$name;
        $this->isError=0;
        $this->mod=$mod;
        $path=$this->path;
        if ($name!='')
        {
            @mkdir($this->path,0777);
            if (!file_exists($path.'/'.$name.'.tdb')) $this->dbh=fopen($this->path.'/'.$name.'.tdb','w+');
            else $this->dbh=fopen($path.'/'.$name.'.tdb','r+');
            if (!file_exists($path.'/'.$name.'.indx')) $this->indxh=fopen($this->path.'/'.$name.'.indx','w+');
            else $this->indxh=fopen($path.'/'.$name.'.indx','r+');
            if (!file_exists($path.'/'.$name.'.lft')) $this->lfth=fopen($this->path.'/'.$name.'.lft','w+');
            else $this->lfth=fopen($this->path.'/'.$name.'.lft','r+');
            if ($this->mod=='w')
            {
                 $this->lckh=fopen($this->path.'/'.$name.'.lck','w');
                 flock($this->lckh,2);
                 fwrite($this->lckh,'lck');//lock the datebase
            }
            $rcd=$this->getRcd(0);
            $this->rcdCnt=$rcd[id];
            $this->maxID=$rcd[loc];
            $this->DBend=$rcd[len];
            $rcd=$this->getLeft(0);
            $this->leftCnt=$rcd[loc];
        }
        else $this->isError=1;
    }

    function setRcd($rid,$id,$loc,$len)
    {
        fseek($this->indxh,$rid*12);
        $str=pack('III',$id,$loc,$len);
        fwrite($this->indxh,$str,12);
    }

    function getRcd($rid)
    {
        fseek($this->indxh,$rid*12);
        $str=fread($this->indxh,12);
        $rcd=array();
        $rcd[id]=str2int($str);
        $rcd[loc]=str2int(substr($str,4,4));
        $rcd[len]=str2int(substr($str,8,4));
        return $rcd;
    }

    function setLeft($lid,$loc,$len)
    {
        fseek($this->lfth,$lid*8);
        $str=pack('II',$loc,$len);
        fwrite($this->lfth,$str,8);
    }

    function getLeft($lid)
    {
        fseek($this->lfth,$lid*8);
        $str=fread($this->lfth,8);
        $rcd[loc]=str2int($str);
        $rcd[len]=str2int(substr($str,4,4));
        return $rcd;
    }

    function clear()
    {
        $this->setRcd(0,0,0,0);
        $this->setLeft(0,0,0);
    }

    function close()
    {
        @fclose($this->dbh);
        @fclose($this->indxh);
        @fclose($this->lfth);
        @fclose($this->lckh);
    }

    function seekSpace($len)
    {
        $res=array('loc'=>0,'len'=>0);
        if ($this->leftCnt        $find=0;
        $min=1000000;
        for ($i=$this->leftCnt;$i>0;$i--)
        {
            $res=$this->getLeft($i);
            if ($res[len]==$len) {$find=$i;break;}
            else if($res[len]>$len)
            {
                if ($res[len]-$len                {
                    $min=$res[len]-$len;
                    $find=$i;
                }
            }
        }
        if ($find)
        {
            $res=$this->getLeft($find);
            if ($res[len]            {
                fseek($this->lfth,($find+1)*8);
                $str=fread($this->lfth,($this->leftCnt-$find)*8);
                fseek($this->lfth,$find*8);
                fwrite($this->lfth,$str);
                $this->leftCnt--;
                $this->setLeft(0,$this->leftCnt,0);
                return $res;
            }
            else
            {
                $rs=array();
                $rs[loc]=$res[loc];
                $rs[len]=$len;
                $res[loc]+=$len;
                $this->setLeft($find,$res[loc],$res[len]-$len);
                return $rs;
            }
        }
        else//fail
        {
            $res[len]=0;
            return $res;
        }
    }

    function insert($content,$len=0)//return with record id
    {
        $res=array('loc'=>0);
        if ($this->mod!='w') return 0;
        if (!$len) $len=strlen($content); 
        if ($lenminLen) $len=$this->minLen;
        if ($this->leftCnt) $res=$this->seekSpace($len);
        if (!$res[len])
        {
            $res[loc]=$this->DBend;
            $res[len]=$len;
        }
        if ($res[loc]+$res[len]>$this->DBend) $this->DBend=$res[loc]+$res[len];
        //echo $this->DBend.'
';
        $this->maxID++;
        $this->rcdCnt++;
        $this->setRcd(0,$this->rcdCnt,$this->maxID,$this->DBend);
        $this->setRcd($this->rcdCnt,$this->maxID,$res[loc],$res[len]);
        fseek($this->dbh,$res[loc]);
        fwrite($this->dbh,$content,$len);
        return $this->maxID;
    }

    function findByID($id)
    {
        if ($id$this->maxID or $this->rcdCnt        $left=1;
        $right=$this->rcdCnt;
        while($left        {
            $mid=(int)(($left+$right)/2);
            if ($mid==$left or $mid==$right) break;
            $rcd=$this->getRcd($mid);
            if ($rcd[id]==$id) return $mid;
            else if($id            else $left=$mid;
        }
        //$rcd=$this->getRcd($mid);
        //if ($rcd[id]==$id) return $mid;
        $rcd=$this->getRcd($left);
        if ($rcd[id]==$id) return $left;
        $rcd=$this->getRcd($right);
        if ($rcd[id]==$id) return $right;
        return 0;
    }

    function delete($id)
    {
        if ($this->mod!='w') return 0;
        $rid=$this->findByID($id);
        if (!$rid) return;
        $res=$this->getRcd($rid);
        fseek($this->indxh,($rid+1)*12);
        $str=fread($this->indxh,($this->rcdCnt-$i)*12);
        fseek($this->indxh,$rid*12);
        fwrite($this->indxh,$str);
        $this->rcdCnt--;
        if ($res[loc]+$res[len]==$this->DBend)
        {
            $this->DBend=$res[loc];
            $this->setRcd(0,$this->rcdCnt,$this->maxID,$this->DBend);
        }
        else
        {
            $this->setRcd(0,$this->rcdCnt,$this->maxID,$this->DBend);
            $this->leftCnt++;
            $this->setLeft(0,$this->leftCnt,0);
            $this->setLeft($this->leftCnt,$res[loc],$res[len]);
        }
    }

    function update($id,$newcontent,$len=0)
    {
        if ($this->mod!='w') return;
        $rid=$this->findByID($id);
        if (!$rid) return;
        if (!$len) $len=strlen($newcontent); 
        $rcd=$this->getRcd($rid);
        if ($rcd[len]        {
            $this->leftCnt++;
            $this->setLeft(0,$this->leftCnt,0);
            $this->setLeft($this->leftCnt,$rcd[loc],$rcd[len]);
            $rcd[loc]=$this->DBend;
            $rcd[len]=$len;
            $this->DBend+=$len;
            $this->setRcd(0,$this->rcdCnt,$this->maxID,$this->DBend);
            $this->setRcd($rid,$rcd[id],$rcd[loc],$rcd[len]);
        }
        fseek($this->dbh,$rcd[loc]);
        fwrite($this->dbh,$newcontent,$len);
        //echo $id.'
'.$content.'
'.$len;
    }

    function selectByRid($rid)
    {
        $res=array('id'=>0,'content'=>'');
        if ($rid$this->rcdCnt) return $res;
        else $rcd=$this->getRcd($rid);
        $res[id]=$rcd[id];
        $res[len]=$rcd[len];
        fseek($this->dbh,$rcd[loc]);
        $res[content]=fread($this->dbh,$rcd[len]);
        //$res[rid]=$rid;
        return $res;
    }

    function select($id)
    {
        return $this->selectByRid($this->findByID($id));
    }

    function backup()
    {
        copy($this->path.'/'.$this->name.'.tdb',$this->path.'/'.$this->name.'.tdb.bck');
        copy($this->path.'/'.$this->name.'.indx',$this->path.'/'.$this->name.'.indx.bck');
        copy($this->path.'/'.$this->name.'.lft',$this->path.'/'.$this->name.'.lft.bck');
    }

    function recover()
    {
        copy($this->path.'/'.$this->name.'.tdb.bck',$this->path.'/'.$this->name.'.tdb');
        copy($this->path.'/'.$this->name.'.indx.bck',$this->path.'/'.$this->name.'.indx');
        copy($this->path.'/'.$this->name.'.lft.bck',$this->path.'/'.$this->name.'.lft');
    }
}

?>

 

PS: 其他可以参考上一篇文章:http://blog.csdn.net/heiyeshuwu/archive/2006/06/16/804265.aspx

 


 



Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Lösung: Ihre Organisation verlangt von Ihnen, dass Sie Ihre PIN ändern Lösung: Ihre Organisation verlangt von Ihnen, dass Sie Ihre PIN ändern Oct 04, 2023 pm 05:45 PM

Auf dem Anmeldebildschirm wird die Meldung „Ihre Organisation hat Sie gebeten, Ihre PIN zu ändern“ angezeigt. Dies geschieht, wenn das PIN-Ablauflimit auf einem Computer erreicht wird, der organisationsbasierte Kontoeinstellungen verwendet und die Kontrolle über persönliche Geräte hat. Wenn Sie Windows jedoch über ein persönliches Konto einrichten, sollte die Fehlermeldung im Idealfall nicht erscheinen. Obwohl dies nicht immer der Fall ist. Die meisten Benutzer, die auf Fehler stoßen, melden dies über ihre persönlichen Konten. Warum fordert mich meine Organisation auf, meine PIN unter Windows 11 zu ändern? Es ist möglich, dass Ihr Konto mit einer Organisation verknüpft ist. Ihr primärer Ansatz sollte darin bestehen, dies zu überprüfen. Die Kontaktaufnahme mit Ihrem Domain-Administrator kann hilfreich sein! Darüber hinaus können falsch konfigurierte lokale Richtlinieneinstellungen oder falsche Registrierungsschlüssel Fehler verursachen. Im Augenblick

So passen Sie die Fensterrahmeneinstellungen unter Windows 11 an: Farbe und Größe ändern So passen Sie die Fensterrahmeneinstellungen unter Windows 11 an: Farbe und Größe ändern Sep 22, 2023 am 11:37 AM

Windows 11 bringt frisches und elegantes Design in den Vordergrund; die moderne Benutzeroberfläche ermöglicht es Ihnen, feinste Details, wie zum Beispiel Fensterränder, zu personalisieren und zu ändern. In diesem Leitfaden besprechen wir Schritt-für-Schritt-Anleitungen, die Ihnen dabei helfen, eine Umgebung zu erstellen, die Ihrem Stil im Windows-Betriebssystem entspricht. Wie ändere ich die Fensterrahmeneinstellungen? Drücken Sie +, um die Einstellungen-App zu öffnen. WindowsIch gehe zu Personalisierung und klicke auf Farbeinstellungen. Farbänderung Fensterränder Einstellungen Fenster 11" Breite="643" Höhe="500" > Suchen Sie die Option Akzentfarbe auf Titelleiste und Fensterrändern anzeigen und schalten Sie den Schalter daneben um. Um Akzentfarben im Startmenü und in der Taskleiste anzuzeigen Um die Designfarbe im Startmenü und in der Taskleiste anzuzeigen, aktivieren Sie „Design im Startmenü und in der Taskleiste anzeigen“.

Wie ändere ich die Farbe der Titelleiste unter Windows 11? Wie ändere ich die Farbe der Titelleiste unter Windows 11? Sep 14, 2023 pm 03:33 PM

Standardmäßig hängt die Farbe der Titelleiste unter Windows 11 vom gewählten Dunkel-/Hell-Design ab. Sie können es jedoch in jede gewünschte Farbe ändern. In diesem Leitfaden besprechen wir Schritt-für-Schritt-Anleitungen für drei Möglichkeiten, wie Sie Ihr Desktop-Erlebnis ändern und personalisieren können, um es optisch ansprechend zu gestalten. Ist es möglich, die Farbe der Titelleiste von aktiven und inaktiven Fenstern zu ändern? Ja, Sie können die Farbe der Titelleiste aktiver Fenster mit der App „Einstellungen“ ändern, oder Sie können die Farbe der Titelleiste inaktiver Fenster mit dem Registrierungseditor ändern. Um diese Schritte zu lernen, fahren Sie mit dem nächsten Abschnitt fort. Wie ändere ich die Farbe der Titelleiste in Windows 11? 1. Drücken Sie in der App „Einstellungen“ +, um das Einstellungsfenster zu öffnen. WindowsIch gehe zu „Personalisierung“ und dann

OOBELANGUAGE-Fehlerprobleme bei der Reparatur von Windows 11/10 OOBELANGUAGE-Fehlerprobleme bei der Reparatur von Windows 11/10 Jul 16, 2023 pm 03:29 PM

Wird auf der Windows Installer-Seite „Ein Problem ist aufgetreten“ zusammen mit der Anweisung „OOBELANGUAGE“ angezeigt? Aufgrund solcher Fehler bricht die Installation von Windows manchmal ab. OOBE bedeutet Out-of-the-Box-Erlebnis. Wie aus der Fehlermeldung hervorgeht, handelt es sich hierbei um ein Problem im Zusammenhang mit der OOBE-Sprachauswahl. Sie müssen sich keine Sorgen machen, Sie können dieses Problem durch eine geschickte Bearbeitung der Registrierung über den OOBE-Bildschirm selbst lösen. Schnelllösung – 1. Klicken Sie unten in der OOBE-App auf die Schaltfläche „Wiederholen“. Dadurch wird der Prozess ohne weitere Probleme fortgesetzt. 2. Verwenden Sie den Netzschalter, um das Herunterfahren des Systems zu erzwingen. Nach dem Neustart des Systems sollte OOBE fortgesetzt werden. 3. Trennen Sie das System vom Internet. Schließen Sie alle Aspekte von OOBE im Offline-Modus ab

So aktivieren oder deaktivieren Sie die Vorschau von Miniaturansichten in der Taskleiste unter Windows 11 So aktivieren oder deaktivieren Sie die Vorschau von Miniaturansichten in der Taskleiste unter Windows 11 Sep 15, 2023 pm 03:57 PM

Miniaturansichten in der Taskleiste können Spaß machen, aber auch ablenken oder stören. Wenn man bedenkt, wie oft Sie mit der Maus über diesen Bereich fahren, haben Sie möglicherweise ein paar Mal versehentlich wichtige Fenster geschlossen. Ein weiterer Nachteil besteht darin, dass es mehr Systemressourcen verbraucht. Wenn Sie also nach einer Möglichkeit suchen, ressourceneffizienter zu arbeiten, zeigen wir Ihnen, wie Sie es deaktivieren können. Wenn Ihre Hardware-Spezifikationen jedoch dafür geeignet sind und Ihnen die Vorschau gefällt, können Sie sie aktivieren. Wie aktiviere ich die Miniaturvorschau der Taskleiste in Windows 11? 1. Tippen Sie in der App „Einstellungen“ auf die Taste und klicken Sie auf „Einstellungen“. Klicken Sie unter Windows auf „System“ und wählen Sie „Info“. Klicken Sie auf Erweiterte Systemeinstellungen. Navigieren Sie zur Registerkarte „Erweitert“ und wählen Sie unter „Leistung“ die Option „Einstellungen“ aus. Wählen Sie „Visuelle Effekte“

Was sind die Unterschiede zwischen Huawei GT3 Pro und GT4? Was sind die Unterschiede zwischen Huawei GT3 Pro und GT4? Dec 29, 2023 pm 02:27 PM

Viele Benutzer werden sich bei der Auswahl von Smartwatches für die Marke Huawei entscheiden. Viele Benutzer sind neugierig auf den Unterschied zwischen Huawei GT3pro und GT4. Was sind die Unterschiede zwischen Huawei GT3pro und GT4? 1. Aussehen GT4: 46 mm und 41 mm, das Material ist Glasspiegel + Edelstahlgehäuse + hochauflösende Faserrückschale. GT3pro: 46,6 mm und 42,9 mm, das Material ist Saphirglas + Titangehäuse/Keramikgehäuse + Keramikrückschale 2. Gesundes GT4: Mit dem neuesten Huawei Truseen5.5+-Algorithmus werden die Ergebnisse genauer. GT3pro: EKG-Elektrokardiogramm sowie Blutgefäß und Sicherheit hinzugefügt

Anleitung zur Anzeigeskalierung unter Windows 11 Anleitung zur Anzeigeskalierung unter Windows 11 Sep 19, 2023 pm 06:45 PM

Wir alle haben unterschiedliche Vorlieben, wenn es um die Anzeigeskalierung unter Windows 11 geht. Manche Leute mögen große Symbole, andere mögen kleine Symbole. Wir sind uns jedoch alle einig, dass die richtige Skalierung wichtig ist. Eine schlechte Schriftartenskalierung oder eine Überskalierung von Bildern kann bei der Arbeit ein echter Produktivitätskiller sein. Sie müssen daher wissen, wie Sie sie anpassen können, um die Fähigkeiten Ihres Systems optimal zu nutzen. Vorteile des benutzerdefinierten Zooms: Dies ist eine nützliche Funktion für Personen, die Schwierigkeiten haben, Text auf dem Bildschirm zu lesen. Es hilft Ihnen, mehr gleichzeitig auf dem Bildschirm zu sehen. Sie können benutzerdefinierte Erweiterungsprofile erstellen, die nur für bestimmte Monitore und Anwendungen gelten. Kann dazu beitragen, die Leistung von Low-End-Hardware zu verbessern. Dadurch haben Sie mehr Kontrolle darüber, was auf Ihrem Bildschirm angezeigt wird. So verwenden Sie Windows 11

10 Möglichkeiten, die Helligkeit unter Windows 11 anzupassen 10 Möglichkeiten, die Helligkeit unter Windows 11 anzupassen Dec 18, 2023 pm 02:21 PM

Die Bildschirmhelligkeit ist ein wesentlicher Bestandteil der Nutzung moderner Computergeräte, insbesondere wenn Sie über einen längeren Zeitraum auf den Bildschirm schauen. Es hilft Ihnen, die Belastung Ihrer Augen zu reduzieren, die Lesbarkeit zu verbessern und Inhalte einfach und effizient anzuzeigen. Abhängig von Ihren Einstellungen kann es jedoch manchmal schwierig sein, die Helligkeit zu verwalten, insbesondere unter Windows 11 mit den neuen Änderungen an der Benutzeroberfläche. Wenn Sie Probleme beim Anpassen der Helligkeit haben, finden Sie hier alle Möglichkeiten, die Helligkeit unter Windows 11 zu verwalten. So ändern Sie die Helligkeit unter Windows 11 [10 Möglichkeiten erklärt] Benutzer eines einzelnen Monitors können die folgenden Methoden verwenden, um die Helligkeit unter Windows 11 anzupassen. Hierzu zählen sowohl Desktop-Systeme mit einem einzelnen Monitor als auch Laptops. Lasst uns beginnen. Methode 1: Verwenden Sie das Action Center. Das Action Center ist zugänglich

See all articles