yzc261亚洲城官网备用地址想做一个用户量非常小的网站,数据存储要怎么选?

( yzc261亚洲城官网备用地址 )

想做一个用户量非常小的网站,用户数量几人到十几人左右,这个用户量真的非常小了。
后端用php,现在想知道数据存储应该怎么做。

因为用户量很小,所以主机配置也将会很低,使用mysql感觉既大材小用,且可能会因为主机配置太低影响性能。

考虑过直接存到文件里(数据都是比较简单的结构,json都能搞定),但是这样的话如果有关联查询(比如mysql的join),那就都要用php自己做关联查询了,感觉有些麻烦。

有没有什么更好的办法?比如超轻量级的数据库?

PS:redis这些就不要了,因为主机配置低,内存肯定吃紧。像mysql和redis这种大力出奇迹的没法在这种邋遢环境下发挥实力。

用SQLite,或者干脆文件存储,文件存储的话,数据文件放到webroot之外。

楼上正解,sqlite.轻量级的,不需要服务,文件即可,之前参与过研发的项目客户端就用到了sqlite

还是mysql,文件读写的效率比使用mysql更低,而且你开发的时候也会额外增加困难。建议你先试试,主机配置再低会低过树莓派吗?当然,如果主机配置本来就低还非要装windows就没辙了。

如果你是用orm开发,前期选数据库并不是你要考虑的东西
如果是你写sql开发,那你就要考虑如果以后数据库换了,你写的sql并不一定能兼容

主机配置再低,也没有你想像的那么夸张,像mysql,postgres肯定是可以跑得动的

推荐SQLite,PHP自带扩展,虽然功能和数据类型上比起MySQL要简单得多,但常用的都没问题,而且性能也非常不错。

你用SQLite的话,数据文件最好不要放在网站根目录,否则人家知道URL就下载了.
当然你可以配置Apache/Nginx deny掉访问指定文件的请求,但终归还是个隐患,
所以还是放网站根目录外吧.
另外你用SQLite的话,你还要写SQL语言,还要用PDO那一套函数来操作:

<?php

function db {
    static $db;
    if $db {
        return $db;
    } else {
        try {
            $db = new PDOsqlite:.$_SERVER[DOCUMENT_ROOT]./../data.db3;
        } catch PDOException $e {
            echo $e->getMessage;
            exit;
        }
        return $db;
    }
}

function insert$title = , $content =  {
    global $app;
    $db = db;
    $stmt = $db->prepareINSERT INTO posts post_title, post_content VALUES ?, ?;
    $stmt->bindParam1, $title,   PDO::PARAM_STR;
    $stmt->bindParam2, $content, PDO::PARAM_STR;
    $stmt->execute;
    return $stmt->rowCount !== 0 ? 
        arraytrue,  lastInsertId => $db->lastInsertId : 
        arrayfalse, lastInsertId => $db->lastInsertId;
}

function select$id =  {
    global $app;
    $db = db;
    if !empty$id {
        return $db->querySELECT * FROM posts WHERE id = .intval$id->fetchAllPDO::FETCH_ASSOC;
    } else {
        return $db->querySELECT * FROM posts->fetchAllPDO::FETCH_ASSOC;
    }
}

function select_v2$id =  {
    global $app;
    $db = db;
    if !empty$id {
        $stmt = $db->prepareSELECT * FROM posts WHERE id = ?;
        $stmt->bindParam1, $id, PDO::PARAM_INT;
    } else {
        $stmt = $db->prepareSELECT * FROM posts;
    }
    $stmt->execute;
    return $stmt->fetchAllPDO::FETCH_ASSOC;
}

function update$id, $title = , $content =  {
    global $app;
    $db = db;
    
    //echo PDO::ATTR_AUTOCOMMIT; //返回0可见PDO默认禁用自动提交事务.
    //echo $db->getAttributePDO::ATTR_AUTOCOMMIT; exit; //返回1可见MySQL默认会自动提交事务.
    
    //SQLite不支持设置PDO::ATTR_AUTOCOMMIT:
    //SQLite: Uncaught exception PDOException with message The auto-commit mode cannot be changed for this driver
    //$db->setAttributePDO::ATTR_AUTOCOMMIT, false;
    $db->beginTransaction;
    $stmt = $db->prepareUPDATE posts SET post_title = ?, post_content = ? WHERE id = ?;
    
    $stmt->executearray$title,$content,$id; //所有值视作PDO::PARAM_STR处理
    //$stmt->executearray:title => $title,:content => $content,:id => $id;
    //$stmt->bind_paramssi, $title, $content, $id; //对比mysqli
    
    echo sleep3;."
";
    sleep3;
    
    $db->commit;
    //$db->setAttributePDO::ATTR_AUTOCOMMIT, true; //commit提交事务后autocommit记得重新设为true
    return $stmt->rowCount !== 0 ? true : false;
}

function delete$id {
    global $app;
    $db = db;
    return $db->queryDELETE FROM posts WHERE id = .intval$id->rowCount !== 0 ? true : false;
}

function delete_v2$id {
    global $app;
    $db = db;
    $stmt = $db->prepareDELETE FROM posts WHERE id = ?;
    $stmt->bindParam1, $id, PDO::PARAM_INT;
    $stmt->execute;
    return $stmt->rowCount !== 0 ? true : false;
}

headerContent-Type: text/plain; charset=utf-8;

$sqlite = "CREATE TABLE IF NOT EXISTS posts 
    id           INTEGER PRIMARY KEY,
    post_title   VARCHAR255 NOT NULL,
    post_content TEXT         NOT NULL
";

db->queryDROP TABLE IF EXISTS posts; or exit;
db->query$sqlite or exit;

//并发时,SQLite在insert时因为库文件被其他请求锁住而导致阻塞
echo "var_exportinsert标题1, 内容1;
";
var_exportinsert标题1, 内容1;
echo "

";

echo "var_exportinsert标题2, 内容2;
";
var_exportinsert标题2, 内容2;
echo "

";

echo "var_exportselect;
";
var_exportselect;
echo "

";

echo "var_exportupdate2, 标题2_更新,内容2_更新;
";
var_exportupdate2, 标题2_更新,内容2_更新;
echo "

";

echo "var_exportselect2;
";
var_exportselect2;
echo "

";

echo "var_exportdelete2;
";
var_exportdelete2;
echo "

";

echo "var_exportselect;
";
var_exportselect;
echo "

";

不知大家有没有这样一种体会,PHP其实是一门面向数组编程的语言.
其实你可以考虑直接用PHP数组导出成文件来存储数据.

<?php
headerContent-Type: text/plain; charset=utf-8;
$file = __DIR__./data.php; //数据文件,别人直接URL访问也下载不了
if!file_exists$file {
    file_put_contents$file, <?php return array;; //file_put_contents$file, ;
}
$fp = fopen$file, r+; //读写方式打开,将文件指针指向文件头
ifflock$fp, LOCK_EX { //阻塞到获取排它锁
    //锁定数据文件后再进行读写
    $arr = require $file; //$arr = unserializefile_get_contents$file;
    $arr[] = dateY-m-d H:i:s;
    ftruncate$fp, 0; //清空文件
    fwrite$fp, <?php return .var_export$arr, true.;; //fwrite$fp, serialize$arr;
    fflush$fp; //在释放锁之前刷新输出
    //sleep10; //睡眠10秒,在此期间其他工作进程的请求将被阻塞
    flock$fp, LOCK_UN; //释放锁定
    echo file_get_contents$file."
";
}
fclose$fp;

注释里还提供了像PHP会话那样serialize/unserialize序列化存储的方法.
值得一说的是,serialize/unserialize的性能要比var_export/require好得多.
不过var_export/require的优势在于不怕别人直接访问,可以把文件放根目录,而且可读性更好.

(看完/读完)这篇文章有何感想! yzc261亚洲城官网备用地址的分享…

发表评论

电子邮件地址不会被公开。 必填项已用*标注