今天收到几个线上项目的异常信息警报。大家都知道 PHP 的异常信息,会把相关的函数/方法调用全部都列出来,如果函数参数不是对象,还会将参数的值也显示出来。
但我发现日志里某个方法被调用的时候,参数的形式跟我之前预想的不一样,本来应该是整型参数,日志显示的却是浮点型的。毕竟相关的业务是跟钱相关的,当时的我慌得一匹。反复看了代码无数遍,此参数由另外一个函数返回,但这个函数规定只能返回整型的变量,怎么看都不可能返回一个浮点数。
难道是我年纪大了老眼昏花?但日志怎么看这参数还是浮点型的,我便开始怀疑起人生了……
看函数调用的部分怎么着都不像有问题,我只能去函数的实现里再探索探索,发现有一行代码,参数被一个数除了之后,结果又被赋予回了这个参数。难道……PHP 异常栈里显示的参数值并不是调用函数那一刻的值?!虽然我已经不幼小,但我的心灵还是被震惊了……
要验证想法倒是也简单,立马写下了以下代码:
function foo($bar)
{
$bar = 2;
throw new Exception();
}
foo(1);
果然……错误日志里显示的 foo 方法的参数居然是 2 而不是 1……
我的猜测是,异常信息毕竟都是反推的。如果每次调用函数的时候,如果为了让异常栈信息记录函数被调用那一刻时的参数值,就得花内存空间去保存当时的参数值,的确有点浪费……我再也不敢称呼自己为 PHP 老司机了……
写作累,服务器还越来越贵
求分担,祝愿好人一生平安
天使打赏人