难道是我火星了?记一次查看 PHP 异常栈遇到的坑

难道是我火星了?记一次查看 PHP 异常栈遇到的坑

Chris Yue 2 comments
Posts

今天收到几个线上项目的异常信息警报。大家都知道 PHP 的异常信息,会把相关的函数/方法调用全部都列出来,如果函数参数不是对象,还会将参数的值也显示出来。

但我发现日志里某个方法被调用的时候,参数的形式跟我之前预想的不一样,本来应该是整型参数,日志显示的却是浮点型的。毕竟相关的业务是跟钱相关的,当时的我慌得一匹。反复看了代码无数遍,此参数由另外一个函数返回,但这个函数规定只能返回整型的变量,怎么看都不可能返回一个浮点数。

难道是我年纪大了老眼昏花?但日志怎么看这参数还是浮点型的,我便开始怀疑起人生了……

看函数调用的部分怎么着都不像有问题,我只能去函数的实现里再探索探索,发现有一行代码,参数被一个数除了之后,结果又被赋予回了这个参数。难道……PHP 异常栈里显示的参数值并不是调用函数那一刻的值?!虽然我已经不幼小,但我的心灵还是被震惊了……

要验证想法倒是也简单,立马写下了以下代码:

<?php

function foo($bar)
{
    $bar = 2;
    throw new Exception();
}

foo(1);

果然……错误日志里显示的 foo 方法的参数居然是 2 而不是 1……

我的猜测是,异常信息毕竟都是反推的。如果每次调用函数的时候,如果为了让异常栈信息记录函数被调用那一刻时的参数值,就得花内存空间去保存当时的参数值,的确有点浪费……我再也不敢称呼自己为 PHP 老司机了……

难道是我火星了?记一次查看 PHP 异常栈遇到的坑 by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

写作累,服务器还越来越贵
求分担,祝愿好人一生平安
天使打赏人

2 Comments

bellerosuh

九月 14, 2020 在 5:16 上午

Hello i am new user and i would to ask you, How to disable avatar?

    Chris Yue

    九月 14, 2020 在 9:09 下午

    By changing the code in comments.php to remove avatars

     

发表评论

11 − 6 =