首页 > 原创文章 > 软件开发 > 查看文章

Thinkphp的的代码为什么改了没效果?删了还执行?

所属分类:软件开发 来源: 丁老师原创 更新时间:2026-01-05 09:42 浏览: 785 IP属地: 深圳

有一个使用ThinkPHP框架开发程序的同学,遇到了这样一个问题,程序的代码明明已经改了,但在执行时还是按照以前的代码逻辑执行的,新修改的没有起到效果,并且他为了测试程序,都已经把这个程序文件删除了,但程序还是能执行,不得已求助于丁老师,这到底是怎么回事呢?

问题复测
1.代码修改了没作用,比如以前的输出结果是1,现在改成了2,但在执行时还是返回1;
2.程序删除了也不行,程序文件删除了,还能执行,甚至把目录删除了,都还能执行;
3.在宝塔中,系统即使停止了,程序依旧在运行,日志依旧在输出(是不是很邪门);

问题分析
1.首先我们检查缓存部分,导致程序修改无效,输出结果始终不变,很多时候是由OPcache引起的,OPcaches会缓存编译后的脚本。我们首先检查服务器php是否安装了OPcache扩展,如果已安装的话就先禁用或者卸载。在停止OPcache后重新测试,问题依旧,看来不是OPcache的问题。
2.检查是否有其他缓存,比如程序是否将脚本写入了runtime的cache中,我们禁用cache,同时清空runtime里的文件,问题依旧。
3.检查服务器是否有安装有其他程序或脚本,在定时的执行系统的某个文件,没有发现。
4.检查服务器运行环境,是使用的宝塔面板,发现安装的有Redis、以及守护进程管理器。

问题解决
1.基本上现在可以明确,除了该系统,服务器并没有其他程序执行,可以排除第三方脚本,问题应该主要在程序自身和运行环境上。
2.打开守护进程管理器发现,有几个进程在运行,如图:

image.png

3.打开进程一看,果然,是指向的thinkphp目录,原因找到了,怪不得修改了程序没反应,这是因为守护进程已经将那几个核心程序,加载到了内存中,系统在运行时读取的,是守护进程加载的程序,并不是系统目录的程序,直接修改系统目录的程序,是没用的,修改后必须重启守护进程的服务才会生效。
4.修改后无效的问题解决了,那么系统即使停止了,程序依旧在运行,是怎么回事呢?我们这个时候看到有Redis,打开Redis,点击进入Redis管理。

image.png

image.png

5.我们发现,在redis中,有一个名为autoload的键,键值就是该系统的那个目录,怪不得系统停了也在执行,原来是这样:守护进程读取redis中的记录,然后根据redis返回的脚本路径,不断的执行。解决方法:手动删除这个redis的键值即可。

全文总结
综上所述,引起系统修改无效的原因主要是因为服务器安装了守护进程,而守护进程管理器会将指定的脚本,加载到内存中,此时你直接修改程序是没用的,这个时候系统读取的是内存中的脚本,每次修改守护进程守护的程序后,都需要重启相关的守护进程才可以生效。

同时,此系统采用了守护进程+Redis缓存的架构,守护进程从Redis中读取相关的脚本路径,然后重复执行。因为某种原因Redis的缓存没有得到释放,因此守护进程就不断的执行该路径的脚本,所以即使系统停止了,程序也一直在运行,这就是问题所在。

Thinkphp是一款很强大的框架,在遇到相关问题时,先检查程序本身,其次是检查运行环境,遵循这个逻辑,基本上都能解决问题。

标签:

相关文章

宝塔面板计划任务访问url无效的解决方法

最近,有同学在群里反馈,在使用宝塔面板时,预先设置好的计划任务-访问URL突然无法使用了,每天定时访问URL也都执行了,但是都返回curl: (52) Empty reply from server ★[2024-10-24 14:41...

做网站用H5好还是用VUE好?

今天有同学问,要做一个网站,技术方面是用html5呢还是用vue呢?丁老师给你解答。其实,用html5和用vue,都可以做网站,但是就架构适用性来说,html5和vue有不同的特点。html5做网站的优点:1.快速开发,上手简单,不需要...

Uniapp开发小程序内的图片扫码

在使用uniapp开发的小程序内,打开图片,长按没有弹出菜单,无法扫码,此时只需在图片上加入show-menu-by-longpress即可完整代码:<image :src="picture" mode=&qu...

Android Kotlin文件转换为Jav...

Android Kotlin文件可以转换为Java文件,方法为:1.点击菜单Menu Tools Kotlin Show Kotlin Bytecode2.点击编译Decompile按钮复制Java代码,完成!

推荐文章

IntelliJ/phpstorm/webs...

在使用jet brains的ide开发代码时,经常性的会输入单引号或双引号,ide默认有对于引号的自动完成功能,即输入一个引号,自动显示两个,这一点其实做的很不智能,因为在使用时经常会有显示出3个的情况,那么怎么关闭这个功能呢?file-s...

如何删除idea软件搜索时的find mas...

在使用idea系列的配套软件时,如intellij idea、Php Storm、Web Strom时,在搜索文件时,右上角的file mask可以筛选指定类型的文件。但是有时候可能会输入错误,产生多个记录,而且没办法删除,在以后的开发中经...

APP/小程序/网站/对接微信支付常见问题解...

现在微信支付已经超越支付宝,成为中国最广泛的在线支付方式。作为互联网电子商务服务商,如何开通对接微信支付?如何使用微信支付呢?丁老师整理一篇微信支付常见的问题解答。一、如何开通微信支付?微信支付可以在微信支付官网(https://pay.w...

Javascript复制对象改变原值的解决办...

在进行vue开发中,经常会遇到复制对象,赋值新对象后,原对象值被改变的问题,举个例子:let old={ "a":1, "b":2 } let new=old; new['c']=3;...

当前在线
免费咨询