아주 적은 수의 사용자로 웹사이트를 구축하고 싶습니다. 사용자 수는 몇 명에서 수십 명 이상입니다.
백엔드는 php를 사용하는데, 이제 데이터를 저장하는 방법을 알고 싶습니다.
사용자 수가 매우 적기 때문에 호스트 구성도 매우 낮습니다. mysql을 사용하면 호스트 구성이 너무 낮아 성능에 영향을 미칠 수 있습니다.
파일에 직접 저장하는 것을 고려했지만(데이터의 구조가 비교적 간단하고 json이 처리할 수 있음) 관련된 쿼리(예: mysql의 조인)가 있으면 PHP를 사용해야 합니다. 관련 검색어를 직접 작성하는 것이 조금 번거롭습니다.
더 좋은 방법은 없을까요? 초경량 데이터베이스를 좋아하시나요?
PS: 호스트 구성이 낮고 메모리가 확실히 부족하기 때문에 Redis가 필요하지 않습니다. mysql이나 redis처럼 기적을 만들기 위해 애쓰는 기업은 이런 허술한 환경에서는 제 힘을 발휘할 수 없습니다.
답글 내용:
아주 적은 수의 사용자로 웹사이트를 구축하고 싶습니다. 사용자 수는 몇 명에서 수십 명 이상입니다.
백엔드는 php를 사용하는데, 이제 데이터를 저장하는 방법을 알고 싶습니다.
사용자 수가 매우 적기 때문에 호스트 구성도 매우 낮습니다. mysql을 사용하면 호스트 구성이 너무 낮아 성능에 영향을 미칠 수 있습니다.
파일에 직접 저장하는 것을 고려했지만(데이터의 구조가 비교적 간단하고 json이 처리할 수 있음) 관련된 쿼리(예: mysql의 조인)가 있으면 PHP를 사용해야 합니다. 관련 검색어를 직접 작성하는 것이 조금 번거롭습니다.
더 좋은 방법은 없을까요? 초경량 데이터베이스를 좋아하시나요?
PS: 호스트 구성이 낮고 메모리가 확실히 부족하기 때문에 Redis가 필요하지 않습니다. mysql이나 redis처럼 기적을 만들기 위해 애쓰는 기업은 이런 허술한 환경에서는 제 힘을 발휘할 수 없습니다.
SQLite를 사용하거나 단순히 파일 저장소를 사용하는 경우 파일 저장소를 사용하는 경우 데이터 파일은 웹 루트 외부에 배치되어야 합니다.
위의 정답은 sqlite 입니다. 가볍고 서비스도 필요 없고 파일만 있으면 됩니다. sqlite를 사용하기 전에 제가 연구 개발에 참여했던 프로젝트의 클라이언트입니다
여전히 mysql입니다. 파일 읽기 및 쓰기 효율성은 mysql을 사용하는 것보다 낮고, 개발할 때 더욱 어려울 것입니다. 먼저 시도해 보시기 바랍니다. 호스트 구성이 Raspberry Pi보다 낮을까요? 물론 호스트 구성이 이미 낮으면 Windows를 설치할 방법이 없습니다.
ORM을 사용하여 개발하는 경우 초기 단계에서 데이터베이스를 선택하는 것은 고려할 사항이 아닙니다.
SQL 개발을 작성하는 경우 향후 데이터베이스가 변경되면 고려해야 합니다. 작성한 SQL이 호환되지 않을 수 있습니다.
호스트 구성이 아무리 낮아도 생각만큼 과장되지는 않습니다. MySQL과 Postgres는 확실히 실행됩니다.
SQLite를 권장합니다. PHP에는 확장 기능이 포함되어 있지만 기능과 데이터 유형은 MySQL보다 훨씬 간단하지만 일반적으로 사용되는 것들도 괜찮고 성능도 매우 좋습니다.
SQLite를 사용하는 경우 웹사이트의 루트 디렉터리에 데이터 파일을 저장하지 않는 것이 가장 좋습니다. 그렇지 않으면 사람들이 URL을 알고 있으면 해당 파일을 다운로드하게 됩니다.
물론 요청을 거부하도록 Apache/Nginx를 구성할 수 있습니다. 지정된 파일에 접근하기는 하지만 결국에는 숨겨진 위험이 있습니다.
그래서 웹사이트의 루트 디렉터리 외부에 두는 것이 좋습니다.
또한 SQLite를 사용하는 경우 SQL 언어를 작성해야 합니다. PDO 기능 세트를 사용하여 작동합니다.
<code><?php function db() { static $db; if ($db) { return $db; } else { try { $db = new PDO('sqlite:'.$_SERVER['DOCUMENT_ROOT'].'/../data.db3'); } catch (PDOException $e) { echo $e->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";</code>
그런 경험이 있으신지 궁금합니다. PHP는 실제로 배열 지향 프로그래밍 언어입니다.
실제로 PHP 배열을 파일로 직접 내보내 데이터를 저장하는 것을 고려해 볼 수 있습니다.
<code><?php header('Content-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+'); //读写方式打开,将文件指针指向文件头 if(flock($fp, LOCK_EX)) { //阻塞到获取排它锁 //锁定数据文件后再进行读写 $arr = require $file; //$arr = unserialize(file_get_contents($file)); $arr[] = date('Y-m-d H:i:s'); ftruncate($fp, 0); //清空文件 fwrite($fp, '<?php return '.var_export($arr, true).';'); //fwrite($fp, serialize($arr)); fflush($fp); //在释放锁之前刷新输出 //sleep(10); //睡眠10秒,在此期间其他工作进程的请求将被阻塞 flock($fp, LOCK_UN); //释放锁定 echo file_get_contents($file)."\n"; } fclose($fp);</code></code>
주석에서는 PHP 세션처럼 직렬화된 저장소를 직렬화/직렬 해제하는 방법도 제공합니다.
직렬화/직렬 해제 성능이 var_export/require보다 훨씬 낫다는 점은 언급할 가치가 있습니다.
하지만 var_export/ require의 장점 다른 사람이 직접 접근하는 것을 두려워하지 않고 루트 디렉터리에 파일을 넣을 수 있어 가독성이 더 높다는 점입니다.

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.
