有一个使用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是一款很强大的框架,在遇到相关问题时,先检查程序本身,其次是检查运行环境,遵循这个逻辑,基本上都能解决问题。
应用场景场景1:使用APP或小程序,分享给别人的网页内容,当用户打开这个网页内容时,可以自动打开APP或小程序。场景2:短信群发给目标人群,短信内容包含短网址,打开短网址后,可以打开APP或小程序。实现方法:无论是场景1还是场景2,其技...
类目价格标准备注商城小程序(小型)10-20万小型B2C/B2b商城,满足基本商城的所有功能商城小程序(中型)30-60万中型B2C/B2b商城,拥有类似淘宝、京东、拼多多的全部基本功能,可对接物流、仓储系统,支持高并发,安全性和稳定性...
丁老师软件是专业的微信小程序开发服务商。自2017年以来,丁老师先后开发出100余款微信小程序,微信小程序具有轻量化、易于传播等特点,适合线上品牌推广、线上营销等场景。目前微信小程序依然状态火热,想做小程序客户络绎不绝,丁老师持续接单中...
有同学提问,在使用mysql导入数据库时,出现了Unknown collation: 'utf8mb4_0900_ai_ci'的错误,是怎么回事呢?其实这是因为,导出数据时,用的是mysql高版本的数据库,一般来说是8....
正确的USB连线,其次打开开发者选项、USB调试,这些都是老生常谈,就不说了。在确保以上操作无误后,如果还找不到真机,关闭IDE,然后去adb的目录下,即HBuilderX\plugins\launcher\tools\adbs,把adb....
用phpmyadmin导入大数据库文件时,容易502 bad gateway,可以直接在linux上用mysql原生命令导入。1.上传sql文件到目录用Xshell登录服务器,将迁移过来的 sql 文件移到 home 目录下,方便下一步的...
没那么多废话,直接上修改方法public\assets\js\require-table.jspageSize: Config.pagesize || localStorage.getItem("pagesize") |...
最近丁老师软件开发团队收到几个微信小程序二次开发的订单,客户想对他们现有的小程序进行版本迭代和功能升级,但是好多客户在提供资料时都表达不清楚,不是这个不知道就是那个不懂,今天丁老师就微信小程序二次开发,需要准备哪些资料以及流程等问题做一下介...