You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DigitalOcean Linux虚拟机上Nginx+PHP文件系统数据库技术问询

基于文件夹文件系统的Nginx+PHP用户数据存储方案实践

我之前在DigitalOcean的Linux虚拟机上也做过类似的轻量数据存储方案,这种用文件夹+JSON文件替代数据库的方式,在用户规模不大、需求简单的时候确实高效又省心。结合你的场景,我分享几个关键的实践细节和优化点:

一、Nginx限制Users目录公共访问的关键配置

要彻底杜绝外部直接访问Users目录的可能,在Nginx的站点配置里加上这段规则就行:

location /Users/ {
    deny all;
    return 403;
}

这样不管是浏览器直接输入路径,还是爬虫扫描,都没法直接触及用户的JSON文件,所有读写操作只能通过你的PHP脚本完成,安全性有保障。

二、登录时批量读取JSON文件的优化

你现在用file_get_contents()逐个读取60个文件,其实可以用glob()先批量获取用户目录下的所有JSON文件路径,再统一处理,代码更简洁也更易维护:

// 替换成实际的用户目录路径
$userDir = '/var/www/Users/User1/';
// 获取目录下所有.json文件
$jsonFiles = glob($userDir . '*.json');
$userData = [];

foreach ($jsonFiles as $file) {
    $fileContent = file_get_contents($file);
    $data = json_decode($fileContent, true);
    // 跳过解析失败的损坏文件
    if ($data !== null) {
        // 用文件名(去掉后缀)作为数据键,方便前端处理
        $key = basename($file, '.json');
        $userData[$key] = $data;
    }
}

// 将整理好的用户数据返回给浏览器
echo json_encode($userData);

另外要注意权限问题:给Users目录设置www-data(Nginx/PHP默认运行用户)的读权限,执行chown -R www-data:www-data /var/www/Users/,权限设为750就足够,避免其他系统用户随意访问。

三、保存文件时的原子性与安全性

用file_put_contents()写文件时,一定要加上LOCK_EX参数,避免多个请求同时写入同一个文件导致数据冲突或损坏:

$filePath = '/var/www/Users/User1/file1.json';
// 编码时加上格式化和中文不转义参数,方便排查问题
$jsonContent = json_encode($newData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// 加LOCK_EX确保写入时独占文件
$writeSuccess = file_put_contents($filePath, $jsonContent, LOCK_EX);

if ($writeSuccess === false) {
    // 处理写入失败的情况,比如返回错误信息给前端
    http_response_code(500);
    echo json_encode(['error' => '保存数据失败']);
}

同样,用户目录需要给www-data设置写权限,权限建议设为750,绝对不要用777,避免权限泄露。

四、未来扩展性的小建议

目前每个用户60个JSON文件的规模,这个方案完全够用,但如果以后用户量或文件数量大幅增长,可能会遇到批量读取慢、文件锁冲突频繁的问题。到时候可以考虑:

  • 把常用用户数据缓存到Redis,登录时优先读缓存,缓存失效再读文件;
  • 逐步迁移到轻量数据库(比如SQLite),再过渡到MySQL/PostgreSQL等关系型数据库。

内容的提问来源于stack exchange,提问作者Shawn Cooke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:37:51