Webman不支持浏览器端访问本地文件系统,PHP进程在服务器端读写文件应使用file_get_contents和file_put_contents等安全函数,避免直接操作句柄;配置文件不可动态写入,须手动修改后重启服务。

Webman 本身不提供浏览器端访问本地文件系统的权限,所谓“操作本地文件系统”必须明确区分:是 PHP 进程在服务器上读写文件(如日志、配置、上传临时文件),还是前端试图读写用户电脑上的文件(需 Web API 如 showOpenFilePicker)。后者与 Webman 无关,且受严格安全限制。
PHP 层读写服务器本地文件:用 file_get_contents 和 file_put_contents 最稳妥
Webman 是基于 PHP 的常驻进程框架,所有文件操作都在服务端执行。不要尝试用 fopen/fwrite 手动管理句柄,除非你有特殊流控制需求(比如大文件分块处理)。
-
file_get_contents('config/app.php')足够读取小配置文件,返回字符串;若需数组结构,配合json_decode或require(仅限 PHP 格式配置) -
file_put_contents('/tmp/log.txt', "msg\n", FILE_APPEND | LOCK_EX)是写日志的推荐方式:自动处理打开/关闭,FILE_APPEND避免覆盖,LOCK_EX防止多进程并发写乱 - 路径必须是服务器绝对路径或相对于 Webman 项目根目录的相对路径;
./storage/logs/比../logs/更安全,避免越界 - 写入前务必检查目录可写:
is_writable(dirname($path)),否则静默失败
别把 Webman 配置当普通文件随意 file_put_contents
Webman 的 config/ 目录下文件(如 config/database.php)是 PHP 返回数组的配置脚本,不是纯文本。直接用 file_put_contents 写入会导致语法错误或被框架忽略。
- 修改配置只能手动编辑文件,然后重启服务(
php start.php restart);config()函数只读,不能写 - 如果需要运行时动态存数据(如开关状态),应另建独立文件(如
storage/runtime/feature_flags.php),内容格式为<?php return ['enable_cache' => true];,再用require加载 - 禁止将用户输入拼接到配置文件内容里写入,极易引发远程代码执行(RCE)
上传文件后保存到本地:注意 move_uploaded_file 的路径校验
Webman 接收上传文件后,$request->file('avatar') 返回的是 UploadFile 对象,其 getRealPath() 是临时路径。必须用 move_uploaded_file 移动,不能用 copy 或 file_put_contents(file_get_contents())。
立即学习“PHP免费学习笔记(深入)”;
- 目标路径需白名单校验:
if (!in_array($ext, ['jpg', 'png', 'pdf'])) { return json(['code' => -1]); } - 生成唯一文件名,避免覆盖或猜测路径:
$filename = uniqid() . '.' . $ext; - 目标目录需提前创建并设好权限:
mkdir($dir, 0755, true),且确保 Webman 进程用户(如 www-data)有写权限 - 移动后立即验证:
if (!move_uploaded_file($tmp, $dest)) { /* 失败处理 */ },不要假设一定成功
最易被忽略的一点:Webman 常驻内存,但 file_get_contents 等函数每次调用都是实时读磁盘。如果你在中间件或高频接口里反复读同一个配置文件,又没加缓存层,I/O 会成为瓶颈——这时候该考虑把配置加载到静态变量或使用 apcu 缓存,而不是无脑重读。



















