찾다
백엔드 개발PHP 튜토리얼아주 적은 수의 사용자로 웹사이트를 구축하려면 데이터 저장 공간을 어떻게 선택해야 합니까?

아주 적은 수의 사용자로 웹사이트를 구축하고 싶습니다. 사용자 수는 몇 명에서 수십 명 이상입니다.
백엔드는 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의 장점 다른 사람이 직접 접근하는 것을 두려워하지 않고 루트 디렉터리에 파일을 넣을 수 있어 가독성이 더 높다는 점입니다.

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

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

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

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

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

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

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

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

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

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

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

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

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

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

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

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

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

DVWA

DVWA

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

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

맨티스BT

맨티스BT

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