thinkphp创建目录主要靠自动初始化和手动调用mkdir()两种方式:入口访问时自动生成app/等结构,运行时需用mkdir($path, 0755, true)递归创建上传、日志等目录,并确保runtime/及其父目录对web服务器用户可写。

ThinkPHP 创建目录主要靠自动初始化和手动调用 mkdir() 两种方式,关键在权限设置和路径写法。不是所有目录都能自动生成,有些必须代码里显式创建,否则运行时报 permission denied。
入口访问触发自动建目录
首次访问 index.php(或其它入口文件)时,ThinkPHP 会按配置自动生成应用结构:
- 默认生成
Application/(TP3)或app/(TP5+)目录及子目录,如controller、model、view、config、runtime - 需确保入口所在目录对 Web 服务器用户可写(Linux 下常设为
0755或0775) - Windows 环境通常无权限问题;Linux/macOS 若报错,执行:
chmod -R 0755 Application/或chmod -R 0755 app/
代码中用 mkdir() 手动创建目录
上传、日志、缓存等场景需运行时动态建目录,推荐带递归和权限参数:
- 建单层目录:
mkdir($path, 0755); - 建多级目录(如
uploads/2026/09/):mkdir($path, 0755, true); - 创建前建议先判断:
if (!is_dir($path)) { mkdir($path, 0755, true); } - 注意:路径必须是绝对路径或相对于当前工作目录的完整路径,避免用相对路径如
./uploads导致不可控
通过 build.php 自定义模块结构
TP5+ 支持用 build.php 文件定义模块目录与文件模板,再调用 \think\Build::run() 生成:
- 在项目根目录或
application/下新建build.php - 返回数组,用
'__dir__'声明要建的目录(支持多级),如:'__dir__' => ['controller', 'model', 'view/index'] - 在
public/index.php中加入:\think\Build::run(include '../build.php'); - 刷新页面即可按规则生成新模块目录结构
Runtime 目录权限特别注意
runtime/ 是 ThinkPHP 运行时写入缓存、日志、模板编译的关键目录,必须全程可写:
- TP3 默认是
Application/Runtime/,TP5+ 默认是runtime/(位于项目根目录) - 部署后若提示“无法写入缓存”,不要只改
runtime/权限,还要检查其父目录是否可创建子目录 - 生产环境建议单独设置:
chown -R www-data:www-data runtime/(Nginx/Apache 用户名依实际而定) - 调试阶段可临时加
define('APP_DEBUG', true);,便于看到更具体的权限错误提示
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











