解决thinkphp关闭调试模式404报错问题

2023-10-31

在使用Thinkphp框架进行开发项目,往往在上线之前,需要关闭调试模式,但这时候发现原本访问正常的网页,在关闭调试模式之后无法访问,报错404;

问题回顾:

当设置项目开启调试模式时:define('APP_DEBUG',True);
访问服务:正常访问;
关闭调试模式:define('APP_DEBUG',False);
再次访问服务:访问失败;
一般会得到下图:

问题分析:

出现这类(开启调试模式无问题,关闭调试模式出问题)问题时,一般都是下面这种情况:
由于开启了调试模式,而在调试模式下,一次服务请求会从代码层运行程序(也就是直接执行php完整代码),会涉及到较多的文件IO操作和模板试试编译,并且不会产生任何缓存。所以只要代码不出现问题,是可以正常运行的。
当我们关闭调试模式(修改入口文件index.php,define('APP_DEBUG',FALSE);即可关闭调试模式)系统会自动生成项目编译缓存以及关闭日志写入。并且会在~/Application/Runtime目录下生成common~runtime.php文件,该文件是编译缓存文件,在关闭调试模式下,服务运行会依赖该文件。如果该文件不存在,或是被删除,系统会在下一次请求时生成行的common~runtime.php文件。好,问题的关键就是这里。此处要提及文件以及文件夹的读写可执行权限以及属组(所有者,以及所在组),一般而言,我们的项目文件夹的属主都是我们用户自己,或者是nobody,如下图:
以及/Application文件目录:
可以看到整个文件目录以及子目录属主都为nobody。并且对Runtime目录,其他组的用户没有写权限,也就是说如果非nobody用户,就无法对Runtime进行写操作,也就无法写入生成common~runtime.php。
而驱动php执行的用户一般并非nobody,由于php会搭配一个服务器容器如nginx或apache,拿nginx来说,nginx使用php-fpm进程管理器来执行、管理php,其中直接管理php进程的是php-fpm的worker进程,而php-fpm worker进程默认属主为www,(这里新手容易把启动nginx的用户和nginx内部管理用户混淆,一般启动nginx的用户权限会比较高,如root用户。启动nginx之后,nginx的master进程属主确实是root,但是nginx的worker进程为默认配置的nginx,这样做也是为了系统安全等方面考虑。php-fpm也是一样,启动属主为root,但负责工作的为其默认属主www)如下图所示:
nginx进程基本情况:

php-fpm进程基本情况:
也就是说,当一个请求导到服务端之后,会因为执行者无权在Runtime目录下创建common~runtime.php文件而失败,导致直接404报错。

问题解决:

解决的办法很简单,将Runtime目录的权限改为任何人可读写执行 chmod -R 777 Runtime。再次请求则成功,并且在Runtime目录下产生了一个新文件:

可以看到该文件的属组皆为www。当创建了该文件后,你也可以将Runtime文件夹的权限改为755,也能正常运行(因为该文件已具有,只要具有可读即可)

总结与悖论:

关于如何解决thinkphp关闭调试模式后404报错问题,就讲解到此。其实换个角度讲,可以将这个报错看做是thinkphp设计上的一个悖论。关闭调试模式,意味着显示报错,日志都会被关闭,然而,导致404错误的原因正是thinkphp的系统文件Runtime权限问题,而恰好日志文件就存放于这个文件夹下,使得报错日志无法写入,无法跟踪,让开发者有点懵。
有写得不对的地方请各位指正,希望我的讲解对你能有所帮助,谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决thinkphp关闭调试模式404报错问题 的相关文章

  • 展平数组:保持索引、值等于数组中的位置

    我在尝试以特定方式展平数组时遇到了一些麻烦 这里有一个print r我想要展平的数组的视图 Array 1 gt Array 8 gt 1 9 gt 2 10 gt Array 15 gt Array 22 gt 1
  • Laravel Eloquent 预加载:加入同一个表两次

    我有一个users表和一个约会桌子 在约会表中 我有两个用户 ID customer id staff id 我想检索所有带有客户姓名和员工姓名的约会 users table id name appointments table id st
  • SetInterval 函数不适用于 PHP 文件

    我有这样的index html
  • Codeigniter PHP - 在锚点加载视图

    我在一个长页面的底部有一个表单 如果用户填写了表单但它不验证页面是否以典型的 codeigniter 方式重新加载 this gt load gt view template data 然而 由于表单位于页面底部 我需要将页面加载到那里 就
  • CakePHP Auth 组件使用 $this->Auth->login() 时未登录;

    我是 cakePHP 的新手 我已经阅读了他们的文档 并且正在遵循他们的简单身份验证示例 我还广泛搜索 包括本网站上的答案 来寻找我的问题的答案 我正在使用 cakePHP 2 0 我的 UsersController 的登录功能如下所示
  • 如何使用 php DOM 获取 内的值?

    我如何使用 php DOM 获取 内的值 这是我的 xml 中的一些代码
  • PHP Github Pull 脚本错误“权限被拒绝(公钥)”

    我已经设置了一个 PHP 脚本来执行 GitHub 拉取 这包含在我的 Github 文件夹中 home mysite public html github github pull php 我的服务器已经有 SSH 公钥 就像我执行git
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • Memcache 不会刷新或清除内存

    我一直在尝试清除我的内存缓存 因为我注意到使用时存储占用了近 30 的服务器内存ps aux 所以我运行了以下 php 代码 memcache new Memcache memcache gt connect localhost 11211
  • PHP 中的静态类初始值设定项

    我有一个带有一些静态函数的辅助类 类中的所有函数都需要一个 重 初始化函数来运行一次 就好像它是一个构造函数 有实现这一目标的良好实践吗 我唯一想到的就是打电话init函数 如果它已经运行过一次 使用静态 initialized变种 问题是
  • 在 PHP 中将整数转换为十六进制值

    如何将PHP中第一类中的数字转换为第二类中的数字 是否有内置函数来转换数字 也是我的标题 将整数转换为十六进制值 甚至正确 class Permission const READ 1 const UPDATE 2 const DELETE
  • 为什么 asort 适用于多维数组?

    抱歉 如果这是一个非常基本的问题 我无意中发现asort http php net manual en function asort php似乎适用于多维数组 示例 PHP animals array 1 gt array name gt
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • 如何绕过Access-Control-Allow-Origin?

    我正在一个平台上对我自己的服务器进行ajax调用 他们设置了阻止这些ajax调用的平台 但我需要它从我的服务器获取数据以显示从我的服务器数据库检索到的数据 我的 ajax 脚本正在运行 它可以将数据发送到我的服务器的 php 脚本以允许其处
  • 2 使用我的代码在数组中查询

    我使用滑块来显示我的 WordPress 精选文章 它选择一个自定义类别并返回一定数量的帖子 如何将显示的第一篇帖子设为自定义帖子 我可以直接在滑块代码中添加特定帖子的 ID吗使该帖子首先出现 然后是原始查询返回的其他内容 例如 在页面上
  • 创建单个随机 Magento 优惠券

    我遇到了一些麻烦 我想要做的是每次有人订阅我们的时事通讯时 在 Magento 中自动生成一个随机优惠券代码 这张优惠券可减 10 美元 并且有exp 订阅后两周的日期 因此 我正在尝试编写一个简单的脚本 当提交 订阅我们的时事通讯 表单时
  • 使用 Xpath 进行部分匹配

    我正在尝试创建一个搜索功能 允许使用 Xpath 按歌曲标题或流派进行部分匹配 这是我的 XML 文件
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht
  • Google Drive 服务帐户上传的位置

    我正在尝试使用服务帐户将文件上传到我的 Google 云端硬盘 当我部署此代码时 我不希望用户给予授权 我希望他们上传到我的帐户 我通过 PHP 使用它 下面是我到目前为止的情况 这段代码是基于官方文档给出的例子 当我运行 php 脚本时
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p

随机推荐

  • js遍历字典

    for var key in data html
  • eclipse使用pthread.h遇到“pthread_create”未定义的问题。

    解决方法 a 需要在编译时添加 lpthread参数 g XXXXX cpp lpthread o XXXXX o b 在eclipse中配置 project gt properties gt c c Build gt GCC C Link
  • 并行前缀加法器 verilog

    并行前缀加法器verilog实现 关于并行前缀加法器的介绍 请看这里 前缀网络用KS树 64位加法器的verilog实现如下 module cal union input g2 p2 g1 p1 output G P assign G g2
  • 用它调试线上 bug,真得劲

    webconsole webconsole 是 arthas 提供的 web 页面 它可以让用户在自己的电脑上 连接远程服务器的 arthas 执行命令 命令的执行方式和在服务器直接操作没有任何区别 webconsole 连接远程服务器成功
  • JS实现弹出子窗口并获取返回值功能

    最近一段时间 所做系统需要实现使用js弹出一个自定义窗口 并且获取窗口的返回值功能 经多方查询未能找到较好的示例 所以无奈之下自己开发了一个弹出式窗口 并稍微封装了一下 废话少说 上代码 父页面弹出窗口示例 c id click funct
  • 原码, 反码, 补码各类应用(转载,出处文末附有链接)

    一 机器数和真值 在学习原码 反码和补码之前 需要先了解机器数和真值的概念 1 机器数 一个数在计算机中的二进制表示形式 叫做这个数的机器数 机器数是带符号的 在计算机用一个数的最高位存放符号 正数为0 负数为1 比如 十进制中的数 3 计
  • 关于eclipse tomcat启动但项目无法启动

    1 报错信息 没有加载spring web引起tomcat自己有启动但是项目没有启动 具体的截图 可以清楚的看到tomcat虽然启动了 但是没有项目启动的信息 2 解决方法 我们在将项目添加至tomcat时会发现该项目并没有将web包加载
  • 解决ubuntu 上QT无法被输入中文的BUG

    项目场景 使用QT FOR ROS在Ubuntu上开发ROS项目 问题描述 不管如何切换输入法的中英文都无法在QT上输入中文 只能输入英文 我用的是fcitx 搜狗输入法 原因分析 我认为时因为缺少了一些依赖或者缺少了一些支持中文的包 解决
  • button效果:从右往左慢慢渐变

    题记 我们工作中会出现一些按钮需要用一些2D的效果 用css会发现很容易做到这样的效果 大部分的思路通过过渡 2D hover事件 以及overflow的之间配合实现button按钮的背景颜色的渐变效果 下边是相关的一些代码
  • AndroidManifest详解之Application(有图更好懂)

    能够包含的标签
  • 如何有效进行RLHF的数据标注?

    编者按 随着大语言模型在自然语言处理领域的广泛应用 如何从人类反馈进行强化学习 RLHF 已成为一个重要的技术挑战 并且RLHF需要大量高质量的人工数据标注 这是一个非常费力的过程 本文作者在数据标注领域具有丰富经验 他在本文深入探讨了RL
  • 【大数据】Kafka 入门指南

    Kafka 入门指南 1 Kafka 简介 2 Kafka 架构 3 分区与副本 4 偏移量 5 消费者组 6 总结 1 Kafka 简介 Apache Kafka 是一种高吞吐 分布式的流处理平台 由 LinkedIn 开发并于 2011
  • makefile和make简单笔记

    1 makefile和make的关系 make命令相当于makefile的解析器 2 makefile基本格式 3 make的简单原理 linux文件的数据部分会记录文件的访问和修改时间 atime mtime ctime make会获取依
  • Log4j2 RCE漏洞及靶场搭建

    漏洞简介 Apache Log4j2是一款Java日志框架 是Log4j 的升级版 可以控制每一条日志的输出格式 通过定义每一条日志信息的级别 能够更加细致地控制日志的生成过程 该漏洞是由于Apache Log4j2某些功能存在递归解析功能
  • Linux网络服务:网络设置与基础服务1

    目录 一 理论 1 查看网络配置 2 测试网络连接 3 使用网络配置命令 4 修改网络配置文件 5 DHCP服务 二 实验 1 本地DHCP服务器搭建 2 问题 一 理论 1 查看网络配置 1 使用ifconfig命令查看网络接口地址 主机
  • 服务器机房监控系统研究,远程机房动环监控系统的设计与实现

    摘要 随着国家对电信建设的大力推进 各地的基站机房越来越多 企业也开始通过自建机房来提高网络服务质量 机房内汇聚大量高精密电子设备 一旦这些电子器件发生故障 例如机房温湿度偏高造成电路板老化或者失灵等等 如果没有及时监管到位 极易造成运行设
  • 【芯片设计封装与测试】芯片测试目的、方法、分类及案例

    目录 1 芯片测试概述 目的 方法 1 1 测试在芯片产业价值链上的位置 2 测试如何体现在设计的过程中 2 1 半导体测试定义与基本工作机制 2 2 半导体测试环节分类及对应设备 2 3 设计验证 3 测试的各种类型 3 1 抽样测试和生
  • 数值数据表示(一) ※

    第1关 基础习题 1 1 请编写一个Python程序 实现十进制整数到二进制整数的转换 2 请编写一个Python程序 实现十进制小数到二进制小数的转换 请注意 length参数用于指定转换后二进制位数 3 请编写一个Python程序 实现
  • Android开发黑白灰模式和夜间模式设置

    接口数据来源鸿洋大神 玩安卓 网站 https wanandroid com 黑白灰正常模式和黑白灰夜间模式截图 夜间模式与正常模式截图 黑白灰与原色模式设置 设置灰白色 protected void setGrayScreen Paint
  • 解决thinkphp关闭调试模式404报错问题

    在使用Thinkphp框架进行开发项目 往往在上线之前 需要关闭调试模式 但这时候发现原本访问正常的网页 在关闭调试模式之后无法访问 报错404 问题回顾 当设置项目开启调试模式时 define APP DEBUG True 访问服务 正常