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

아주 적은 수의 사용자로 웹사이트를 구축하려면 데이터 저장 공간을 어떻게 선택해야 합니까?

Aug 04, 2016 am 09:19 AM
php sql 데이터 데이터 베이스

아주 적은 수의 사용자로 웹사이트를 구축하고 싶습니다. 사용자 수는 몇 명에서 수십 명 이상입니다.
백엔드는 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>
로그인 후 복사

주석에서는 PHP 세션처럼 직렬화된 저장소를 직렬화/직렬 해제하는 방법도 제공합니다.
직렬화/직렬 해제 성능이 var_export/require보다 훨씬 낫다는 점은 언급할 가치가 있습니다.
하지만 var_export/ require의 장점 다른 사람이 직접 접근하는 것을 두려워하지 않고 루트 디렉터리에 파일을 넣을 수 있어 가독성이 더 높다는 점입니다.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 Apr 14, 2025 am 12:13 AM

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP 실행 : 실제 예제 및 응용 프로그램 PHP 실행 : 실제 예제 및 응용 프로그램 Apr 14, 2025 am 12:19 AM

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP의 지속적인 관련성 : 여전히 살아 있습니까? PHP의 지속적인 관련성 : 여전히 살아 있습니까? Apr 14, 2025 am 12:12 AM

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP 및 Python : 코드 예제 및 비교 PHP 및 Python : 코드 예제 및 비교 Apr 15, 2025 am 12:07 AM

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.

PHP의 목적 : 동적 웹 사이트 구축 PHP의 목적 : 동적 웹 사이트 구축 Apr 15, 2025 am 12:18 AM

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP와 Python : 다른 패러다임이 설명되었습니다 PHP와 Python : 다른 패러다임이 설명되었습니다 Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오 PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오 Apr 13, 2025 am 12:20 AM

PHP는 현대 웹 개발, 특히 컨텐츠 관리 및 전자 상거래 플랫폼에서 중요합니다. 1) PHP는 Laravel 및 Symfony와 같은 풍부한 생태계와 강력한 프레임 워크 지원을 가지고 있습니다. 2) Opcache 및 Nginx를 통해 성능 최적화를 달성 할 수 있습니다. 3) PHP8.0은 성능을 향상시키기 위해 JIT 컴파일러를 소개합니다. 4) 클라우드 네이티브 애플리케이션은 Docker 및 Kubernetes를 통해 배포되어 유연성과 확장 성을 향상시킵니다.

PHP : 데이터베이스 및 서버 측 로직 처리 PHP : 데이터베이스 및 서버 측 로직 처리 Apr 15, 2025 am 12:15 AM

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

See all articles