<?php /**************************************************** * NKeditor PHP * 本PHP程序是演示程序,建议不要直接在实际项目中使用。 * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。 * ************************************************** * 简易数据库, 单表 100w 条数据,查询一页数据在 0.015 秒左右 * 缺陷,无法排序,如果要排序的话,那么不适合使用 SimpleDB, 请使用 mysql 或者 mongdb * User: yangjian * Date: 17-10-14 * Time: 下午5:15 */ class SimpleDB { /** * 文件资源 * @var null|resource */ private $handler = null; /** * 初始化,打开文件 * SimpleDB constructor. * @param $dbname */ public function __construct($dbname) { $dataDir = __DIR__."/data/"; if (!file_exists($dataDir)) { mkdir($dataDir); } $this->handler = fopen($dataDir.$dbname.'.db', 'a+'); } /** * 写入一行数据 * @return bool */ public function putLine($data) { if ($this->handler != null) { fwrite($this->handler, $this->seralize($data)); } return false; } /** * 分页获取数据列表 * @param $key * @return array|null */ public function getDataList($page, $pagesize) { if($page <= 0) { $page = 1; } $offset = ($page - 1) * $pagesize; //循环读取数据 $datas = []; $counter = 0; while (!feof($this->handler)) { if ($counter < $offset) { fgets($this->handler); //移动指针到下一行 $counter++; continue; } if (count($datas) == $pagesize) { break; } $line = fgets($this->handler); if (!empty($line)) { $datas[] = $this->unseralize($line); } } return $datas; } /** * 序列化数据 * @param $data * @return string */ private function seralize($data) { $break = "\n"; //换行符 if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $break = "\r\n"; } return json_encode($data, JSON_UNESCAPED_UNICODE).$break; } /** * 反序列化 * @param $data * @return mixed */ private function unseralize($data) { return json_decode($data, true); } /** * 关闭文件 */ public function __destruct() { if ($this->handler != null) { fclose($this->handler); } } }