php运行异常问题总结

1、php脚本执行顺序

建立一个info.php测试文件,测试某些php方法时,发现语法错误时什么也不提示,直接报页面500错误
在这里插入图片描述
设置了 ini_set(‘display_errors’,‘On’); error_reporting(E_ALL | E_STRICT); 之后,不起作用,没有错误提示。
直接在php.ini配置文件里修改这两个配置,结果显示了错误提示。

为什么动态配置不行呢,难道是动态设置没有起作用?在把php.ini恢复原样后,在info.php中删除了错误的语法,代码如下

<?php
	ini_set('display_errors','On');
	error_reporting(E_ALL | E_STRICT);
	phpinfo();

打印了phpinfo的信息
在这里插入图片描述
从打印内容看,说明动态配置已经生效了,但是为什么还是不能显示代码的语法错误呢?
因为忽略了php文件的执行机制
PHP是脚本语言,在执行代码时需要先进行一系列的编译处理,才能执行。在文件编译阶段,对代码语法进行了校验,但这个时候代码是不执行的,所以文件开头的动态配置是没有意义的。编译时判断语法错误,脚本直接停止了运行。直接调用了默认配置,不显示错误信息。这就是为什么在php.ini配置可以生效,动态配置无效的原因。

我们此时再新建一个文件error.php

<?php
	$a = 'dd'
	echo $a

修改info.php文件

<?php
	ini_set('display_errors','On');
	error_reporting(E_ALL | E_STRICT);

	include('./error.php');

我们执行info.php文件后,此时顺利的出现了错误信息。

因为此时info.php文件是没有语法错误的,该脚本开始顺利的执行,先执行了动态配置并且生效,然后执行引入error.php文件的操作。error.php文件被引入后,开始进行该文件的校验、编译操作,结果发现该文件语法错误错误,根据已生效的配置,抛出错误提示

在这里插入图片描述

总结:之前没有注意到这个问题,是因为在开发过程中,这些动态配置通常出现在入口文件或者配置文件中,很少会与错误代码处于同一个文件中,动态配置没有被错误代码影响。

2、php编译缓存

一次调试代码过程中,修改代码后,执行后不显示修改后的内容。测试其他文件都正常,唯独这个文件无论怎么修改都不生效,把该文件代码都删除后,执行后仍然展示之前的内容。
经过排查,发现是PHP的opcode问题。
默认情况下,opcache是开启的,如下
在这里插入图片描述
最关键的配置未以下两项
在这里插入图片描述
他们的作用如下
在这里插入图片描述
所以以上opcache配置的作用就是:当一个文件本次修改距上次修改时间不超过10秒,执行缓存中的该文件已编译的代码。
由此想到了此次问题出现的原因。当前日期10月1日,因为测试需要,我把时间修改到了10月2日,测试中修改了文件,然后把日期调回到了10月1日,再次修改文件后,就不再生效了。因为本次修改时间永远小于上次修改时间,导致缓存无法更新。
重启电脑后解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值