想做一个用户量非常小的网站,数据存储要怎么选?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了想做一个用户量非常小的网站,数据存储要怎么选?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5591字,纯文字阅读大概需要8分钟。
内容图文
![想做一个用户量非常小的网站,数据存储要怎么选?](/upload/InfoBanner/zyjiaocheng/156/362b3884335444d4a371d7321e9980c2.jpg)
后端用php,现在想知道数据存储应该怎么做。
因为用户量很小,所以主机配置也将会很低,使用mysql感觉既大材小用,且可能会因为主机配置太低影响性能。
考虑过直接存到文件里(数据都是比较简单的结构,json都能搞定),但是这样的话如果有关联查询(比如mysql的join),那就都要用php自己做关联查询了,感觉有些麻烦。
有没有什么更好的办法?比如超轻量级的数据库?
PS:redis这些就不要了,因为主机配置低,内存肯定吃紧。像mysql和redis这种大力出奇迹的没法在这种邋遢环境下发挥实力。
回复内容:
想做一个用户量非常小的网站,用户数量几人到十几人左右,这个用户量真的非常小了。
后端用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那一套函数来操作:
getMessage();
exit();
}
return $db;
}
}
function insert($title = '', $content = '') {
global $app;
$db = db();
$stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES (?, ?)');
$stmt->bindParam(1, $title, PDO::PARAM_STR);
$stmt->bindParam(2, $content, PDO::PARAM_STR);
$stmt->execute();
return ($stmt->rowCount() !== 0) ?
array(true, 'lastInsertId' => $db->lastInsertId()) :
array(false, 'lastInsertId' => $db->lastInsertId());
}
function select($id = '') {
global $app;
$db = db();
if (!empty($id)) {
return $db->query('SELECT * FROM posts WHERE id = '.intval($id))->fetchAll(PDO::FETCH_ASSOC);
} else {
return $db->query('SELECT * FROM posts')->fetchAll(PDO::FETCH_ASSOC);
}
}
function select_v2($id = '') {
global $app;
$db = db();
if (!empty($id)) {
$stmt = $db->prepare('SELECT * FROM posts WHERE id = ?');
$stmt->bindParam(1, $id, PDO::PARAM_INT);
} else {
$stmt = $db->prepare('SELECT * FROM posts');
}
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
function update($id, $title = '', $content = '') {
global $app;
$db = db();
//echo PDO::ATTR_AUTOCOMMIT; //返回0可见PDO默认禁用自动提交事务.
//echo $db->getAttribute(PDO::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->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$db->beginTransaction();
$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');
$stmt->execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理
//$stmt->execute(array(':title' => $title,':content' => $content,':id' => $id));
//$stmt->bind_param('ssi', $title, $content, $id); //对比mysqli
echo 'sleep(3);'."\n";
sleep(3);
$db->commit();
//$db->setAttribute(PDO::ATTR_AUTOCOMMIT, true); //commit提交事务后autocommit记得重新设为true
return ($stmt->rowCount() !== 0) ? true : false;
}
function delete($id) {
global $app;
$db = db();
return ($db->query('DELETE FROM posts WHERE id = '.intval($id))->rowCount() !== 0) ? true : false;
}
function delete_v2($id) {
global $app;
$db = db();
$stmt = $db->prepare('DELETE FROM posts WHERE id = ?');
$stmt->bindParam(1, $id, PDO::PARAM_INT);
$stmt->execute();
return ($stmt->rowCount() !== 0) ? true : false;
}
header('Content-Type: text/plain; charset=utf-8');
$sqlite = "CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY,
post_title VARCHAR(255) NOT NULL,
post_content TEXT NOT NULL
)";
db()->query('DROP TABLE IF EXISTS posts;') or exit();
db()->query($sqlite) or exit();
//并发时,SQLite在insert时因为库文件被其他请求锁住而导致阻塞
echo "var_export(insert('标题1', '内容1'));\n";
var_export(insert('标题1', '内容1'));
echo "\n\n";
echo "var_export(insert('标题2', '内容2'));\n";
var_export(insert('标题2', '内容2'));
echo "\n\n";
echo "var_export(select());\n";
var_export(select());
echo "\n\n";
echo "var_export(update(2, '标题2_更新','内容2_更新'));\n";
var_export(update(2, '标题2_更新','内容2_更新'));
echo "\n\n";
echo "var_export(select(2));\n";
var_export(select(2));
echo "\n\n";
echo "var_export(delete(2));\n";
var_export(delete(2));
echo "\n\n";
echo "var_export(select());\n";
var_export(select());
echo "\n\n";
不知大家有没有这样一种体会,PHP其实是一门面向数组编程的语言.
其实你可以考虑直接用PHP数组导出成文件来存储数据.
输出
//sleep(10); //睡眠10秒,在此期间其他工作进程的请求将被阻塞
flock($fp, LOCK_UN); //释放锁定
echo file_get_contents($file)."\n";
}
fclose($fp);
注释里还提供了像PHP会话那样serialize/unserialize序列化存储的方法.
值得一说的是,serialize/unserialize的性能要比var_export/require好得多.
不过var_export/require的优势在于不怕别人直接访问,可以把文件放根目录,而且可读性更好.
内容总结
以上是互联网集市为您收集整理的想做一个用户量非常小的网站,数据存储要怎么选?全部内容,希望文章能够帮你解决想做一个用户量非常小的网站,数据存储要怎么选?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。