ThinkPHP隐藏入口文件需URL_MODEL设为2或3并匹配Web服务器规则:Nginx配if重写,Apache启mod_rewrite并确保.htaccess完整;runtime权限须为755且属主正确;app_debug被.env或环境变量覆盖;QueryLog不记录失败SQL,需查PHP错误日志及MySQL底层日志。

ThinkPHP 路由隐藏入口文件 index.php 的实际配置方式
不配对的 URL_MODEL 和 Web 服务器规则,是导致隐藏失败的主因。Nginx 下必须同时改 ThinkPHP 配置和服务器 rewrite 规则,Apache 则依赖 .htaccess 与 URL_MODEL 协同生效。
-
URL_MODEL设为2(PATHINFO 模式)或3(兼容模式),不能设为 0 或 1 —— 否则路由解析直接跳过重写逻辑 - Nginx 需在 location 块中添加:
if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; },注意不是try_files,ThinkPHP 5.1+ 对try_files的 PATHINFO 解析有兼容问题 - Apache 要确认
mod_rewrite已启用,且项目根目录下的.htaccess包含标准 ThinkPHP 规则,尤其是RewriteCond %{REQUEST_FILENAME} !-d这一行不能被删
Runtime 目录权限失控导致缓存写入失败的排查路径
报错 mkdir(): Permission denied 或日志里反复出现 Cache write error,大概率不是代码问题,而是 runtime 子目录(如 cache、log、temp)权限未继承或被部署脚本重置。
- ThinkPHP 启动时会尝试自动创建
runtime下各级子目录,但仅当父目录可写、且 PHP 进程用户(如 www-data)对该目录有rwx权限时才成功 - CI/CD 部署后务必执行:
chown -R www-data:www-data runtime && chmod -R 755 runtime
,777不安全,755足够运行 - 若用 Docker,需在
Dockerfile中显式USER www-data并提前RUN mkdir -p runtime/{cache,log,temp},否则容器启动时权限错乱
config/app.php 中 app_debug 关闭后仍显示错误详情的原因
关掉 app_debug 却还在页面看到堆栈、SQL、变量 dump,说明环境变量或命令行参数覆盖了配置文件设置——ThinkPHP 读取配置的优先级:环境变量 > 命令行参数 > 配置文件。
- 检查是否在
.env文件中写了APP_DEBUG=true,该文件默认存在且优先级最高 - CLI 模式下运行
php think run时加了--debug参数,也会强制开启调试模式 - Apache 的
SetEnv或 Nginx 的fastcgi_param若设置了APP_DEBUG,同样会覆盖config/app.php - 验证方式:在控制器里输出
env('APP_DEBUG')和config('app.app_debug'),二者不一致就说明被外部覆盖了
数据库查询慢却没触发 QueryLog 的真实原因
ThinkPHP 的 think-sql 日志只记录执行成功的 SQL,超时中断、连接失败、语法错误等异常路径下,SQL 根本不会进入日志队列,所以看不到“慢查询”不等于没发生。
立即学习“PHP免费学习笔记(深入)”;
- 先确认
database.log_sql设为true,且database.sql_explain开启后,explain 分析才随日志输出 - 真正耗时的环节常在 PDO 连接建立阶段,比如 MySQL 等待连接池空闲、DNS 解析卡顿,这类不走 QueryLog,得看 PHP 错误日志里的
PDOException或mysqli_connect()超时信息 - 线上环境建议用
SHOW PROCESSLIST或 MySQL 的slow_query_log直接抓底层数据,别只盯 ThinkPHP 日志
复杂点在于:ThinkPHP 的配置层、Web 服务器层、PHP 运行层、MySQL 层各自有一套“开关”,漏掉任意一层,优化动作就失效。最容易被忽略的是环境变量对配置的静默覆盖,查问题前先 echo 一遍 env()。



















