有一个使用ThinkPHP框架开发程序的同学,遇到了这样一个问题,程序的代码明明已经改了,但在执行时还是按照以前的代码逻辑执行的,新修改的没有起到效果,并且他为了测试程序,都已经把这个程序文件删除了,但程序还是能执行,不得已求助于丁老师,这到底是怎么回事呢?
问题复测
1.代码修改了没作用,比如以前的输出结果是1,现在改成了2,但在执行时还是返回1;
2.程序删除了也不行,程序文件删除了,还能执行,甚至把目录删除了,都还能执行;
3.在宝塔中,系统即使停止了,程序依旧在运行,日志依旧在输出(是不是很邪门);
问题分析
1.首先我们检查缓存部分,导致程序修改无效,输出结果始终不变,很多时候是由OPcache引起的,OPcaches会缓存编译后的脚本。我们首先检查服务器php是否安装了OPcache扩展,如果已安装的话就先禁用或者卸载。在停止OPcache后重新测试,问题依旧,看来不是OPcache的问题。
2.检查是否有其他缓存,比如程序是否将脚本写入了runtime的cache中,我们禁用cache,同时清空runtime里的文件,问题依旧。
3.检查服务器是否有安装有其他程序或脚本,在定时的执行系统的某个文件,没有发现。
4.检查服务器运行环境,是使用的宝塔面板,发现安装的有Redis、以及守护进程管理器。
问题解决
1.基本上现在可以明确,除了该系统,服务器并没有其他程序执行,可以排除第三方脚本,问题应该主要在程序自身和运行环境上。
2.打开守护进程管理器发现,有几个进程在运行,如图:

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


5.我们发现,在redis中,有一个名为autoload的键,键值就是该系统的那个目录,怪不得系统停了也在执行,原来是这样:守护进程读取redis中的记录,然后根据redis返回的脚本路径,不断的执行。解决方法:手动删除这个redis的键值即可。
全文总结
综上所述,引起系统修改无效的原因主要是因为服务器安装了守护进程,而守护进程管理器会将指定的脚本,加载到内存中,此时你直接修改程序是没用的,这个时候系统读取的是内存中的脚本,每次修改守护进程守护的程序后,都需要重启相关的守护进程才可以生效。
同时,此系统采用了守护进程+Redis缓存的架构,守护进程从Redis中读取相关的脚本路径,然后重复执行。因为某种原因Redis的缓存没有得到释放,因此守护进程就不断的执行该路径的脚本,所以即使系统停止了,程序也一直在运行,这就是问题所在。
Thinkphp是一款很强大的框架,在遇到相关问题时,先检查程序本身,其次是检查运行环境,遵循这个逻辑,基本上都能解决问题。
在css中,flex弹性布局可以实现内部对象左右、垂直的对齐,在多个html对象中,设置flex后一般情况下,内部的对象高度是保持一致的。比如一个div设置了flex,内部有3个div,这3个div的高度以最高的一个div高度值为准保持...
fastadmin里自定义按钮的btn-dialog,弹出窗口时默认大小,设置了data-area无效,经过研究后,发现了可用的方法,直接上代码不废话:table.on('post-body.bs.table',func...
在fastadmin中,一个页面的非菜单链接,想要点击后打开指定页面,并且菜单自动展开,该怎么实现呢?经过丁老师研究后,发现超级简单,废话不多说,直接上代码:<a class="btn-addtabs" hre...
微信支付常见问题及解决办法
在使用python3.12时突然遇到提示windows No module named distutils,研究了一下,把解决办法分享出来。1.安装 setuptools,它现在也提供 distutils;2.从第三方源(如系统软件包)载入...
正确的USB连线,其次打开开发者选项、USB调试,这些都是老生常谈,就不说了。在确保以上操作无误后,如果还找不到真机,关闭IDE,然后去adb的目录下,即HBuilderX\plugins\launcher\tools\adbs,把adb....
在使用jet brains的ide开发代码时,经常性的会输入单引号或双引号,ide默认有对于引号的自动完成功能,即输入一个引号,自动显示两个,这一点其实做的很不智能,因为在使用时经常会有显示出3个的情况,那么怎么关闭这个功能呢?file-s...
pdf添加水印,可以使用专业的pdf工具,如Adobe Acrobat、福昕PDF阅读器等,支持文字和图片形式的添加水印,支持透明度设置、水印位置设置等。图片添加水印,可以使用photoshop软件,但是photoshop太大了,而且使用起...