冯老师的困惑——测试和正式环境掐架篇(一)

关于冯老师

  • 大名:冯老师
  • 小名:真男人
  • 英文名字:TrueMan
  • 年龄:未知
  • 座右铭:就这???

在我们公司,一提起冯老师,那可谓无人不知,无人不晓。

订单申请不了售后了,怎么办呢?—— 找冯老师。

仓库审核按钮不见了,怎么办呢?—— 找冯老师。

卫生间马桶堵了,怎么办呢—— 找冯老师。

可以说,在我们公司,找冯老师就是「政治正确」。找冯老师,比 ChatGPT 还好使。

不过,即使聪慧如冯老师,也会有踩坑的时候。本系列文章,我们就来细数冯老师踩过的那些「坑」。

冯老师的困惑

周一下班后,我已经收拾好东西准备下班了,冯老师略显踟蹰地走过来,用戏谑的语气对我说:「来来来,架构师,考你个问题,看看你水平怎么样」。

听到这里,我大抵猜到冯老师又遇到问题了—— 他平时都是喊我小乔的。

我放下书包,刚准备去他那里,又突然想到了什么,忙收住脚步。我打开了我的记账本:

附录(PB 兑换规则及收费标准):

PiujdKPUye.png!large

1cyVWmQ00q.png!large

「冯老师,你还欠我 4PB 呢。」

「先记账上就行。」

「好的。按技术服务标准收费,现在是六点零一分,算你六点钟吧。」

冯老师似乎并不关心收费问题,毕竟对于吃惯了四个菜的人来说,这些都是毛毛雨。

「你来看,我给你描述一下问题。」

「同样的代码,我代码在本地和测试环境都正常,但是上线以后,报了一个常量未定义的错误,这可能是什么问题呢?」

我思考片刻,快速捕捉冯老师言语中的重要信息:

  • 直接报错:常量未定义;
  • 本地和测试环境正常,正式环境报错;
  • 正式环境和测试环境代码一致。

神探皮拉夫登场

带着这些所谓的「结论」,我开始了「破案」过程。

我需要做的就是,从上述「线索」出发,一一排查每一条「线索」的真实性。没错,在真相大白之前,我只相信我眼睛看到的东西,其他听到的「证据」在没有得到证实之前,我都称之为「线索」。

关于同样的代码在不同环境下表现不同,无外乎以下两种情况:

  • 代码问题;
  • 环境问题。

环境包括代码运行的编译环境,数据库环境等外部条件。这里经过排查,测试和正式环境都是一致的。而且报错提示是常量未定义的问题,并非环境问题导致。所以,环境问题的嫌疑基本可以排除。

接下来,我们把重点放在代码差异的排查上。

由于代码都是经过 jenkins 自动部署发布的,经过对比核心代码以后,发现经过发布的代码和测试环境并无差异。除了自动部署的代码,还有一部分代码是不走发布的,因为这部分代码属于各环境的环境变量及配置信息,所以这部分代码需要手动维护更新。

接下来,就是排查这部分代码的问题了。

可是,冯老师信誓旦旦地告诉我:「环境变量也是一样的,我都检查过了,不用看。」

环境没有问题,代码也没有问题 —— 常量不存在?一定是见鬼了。

「你确定常量都是一样的吗?」

「你还不相信我。。。来,你来看。」

冯老师打开线上和测试环境的变量给我看(常量定义在了入口文件index.php中,框架用的ThinkPHP 5.0):

正式环境 index.php

define('BIG_KENG', 'IF YOU JUMP, YOU ARE DEAD.');
//========== tms 电子面单 ==========
define('TMS_HOST', 'http://tms.aaa.com');

测试环境 index.php

//========== tms 电子面单 ==========
define('TMS_HOST', 'http://tms-test.aaa.com');

看着确实没什么区别。「这个 BIG_KENG 是个什么东东?」,我随口一问。

「那个不用管,别人定义的,和这里没有关系。」

「哦。」

「常量未定义还有可能是定义常量的文件出现了语法问题,其他常量能用么?」

「能用。」冯老师信誓旦旦地对我说。

「打印一个我瞧瞧。」

「还不相信我。。。这就给你看。」冯老师很不情愿地给我打印了一个其他定义的常量 —— 确实可以正常输出。

「那真的是见鬼了。。。」

往往到了这种兜兜转转又回到起点的时候,我都会想起福尔摩斯对华生说的那句话 —— 排除其他一切可能,最后剩下来的,就算再不可思议,也必定是真相。

我决定再把目光回到index.php这个「重大嫌疑人」身上。

果不其然,真相还就真被我给发现了。

揭秘时刻

当我一拍桌子的时候,冯老师顿时慌了神,怔了一下,脸上随即露出了不可思议又略带嫉妒的笑——「快说,怎么回事?」

每当这个时候,我感觉如果不是吨位大一些的话,我都能飘起来。没有什么事是比在冯老师面前炫耀战果更有成就感的了。

冯老师目不转睛地盯着电脑屏幕,我甚至能听到他紧张的心跳。

我把鼠标选中了以下这行代码:

define('BIG_KENG', 'IF YOU JUMP, YOU ARE DEAD.');

「这是谁写的代码?Tell me。」

冯老师似乎对我这突如其来又貌似八竿子打不着的问题有些不耐烦:「别人写的啊,人家写的也没问题啊,格式都对啊。」

「你打印下试试,看看能正常打印么。」

冯老师似乎对这看上去 100% 无疑义的问题不屑一顾:「这还用打印么,肯定没问题啊,这都是线上正常在跑的,你到底行不行啊。」

「先打印下看看吧,冯老师。万一不行呢?」我耐心劝导着冯老师。

冯老师心中虽然不情愿,但还是照我说的做了。

「擦嘞!!!什么情况」冯老师一脸的不可思议,两只眼睛瞪的像铜铃一样,几乎要迸出来了。

「不可能吧,看不出来哪有问题啊?」冯老师似乎还是没有发现端倪,尽管真相就在他目之所及的代码上方。

我没有说话,只是用鼠标把下面的代码给圈了出来:

// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
define('BIG_KENG', 'IF YOU JUMP, YOU ARE DEAD.');
//========== tms 电子面单 ==========
define('TMS_HOST', 'http://tms.aaa.com');

冯老师看了半晌,还是没看出问题来:「没看出有啥不妥的啊?BIG_KENG 定义的没啥问题啊。」

见冯老师还是没 Get 到我的点,我让他关注下面这行代码:

// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

「我想让你看的是它,冯老师。」

start.php怎么了,不要告诉我你不知道它是启动文件?」

我叹了口气:「你去打开这个start.php,看看它到底干了些啥。」

冯老师照我说的打开了start.php

namespace think;

// ThinkPHP 引导文件
// 1. 加载基础文件
require __DIR__ . '/base.php';

// 2. 执行应用
App::run()->send();

文件内容不多,只有三行代码。这次不等冯老师张口,我便提前给他科普了:「start.php是启动文件,包含了启动应用的操作。而你的常量定义在了启动文件后面,当然就不起作用了。」

「那测试环境为啥……」

//========== tms 电子面单 ==========
define('TMS_HOST', 'http://tms-test.aaa.com');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

「靠!!!」

冯老师沉思了大概有半秒钟,瞬间又换了一副小人得志的嘴脸:「行了,行了,我以为多大问题,就这???」。

我微微一笑,因为我已经习惯了这样的冯老师。

「你们是真的坑,这不能用的代码也往线上发,这不坑人么。」冯老师还在发着小牢骚。

「人家都挂了牌子了啊,你自己不看就往下跳,这赖谁。」

「哪写了?」

「BIG_KENG。。。这还不够明显???」

冯老师起身,摇着头,撅着嘴,念念叨叨地扬长而去,只留给我一个不屈的背影。

我看了一眼手机,此时刚好六点十五分。于是我在记账本上又记下了一笔 —— 替冯老师处理线上环境变量问题,耗时二十分钟,收费 4PB。

总结大会

十分钟前,一切看着不可思议。

十分钟后,一切看着又不过尔尔。

很多时候,不是我们的眼神不够犀利,而是在面对近在咫尺的问题前,我们总是习惯性地自我肯定及否定 —— 我们迟迟走不出圈子,不是因为迈不开脚,而是因为我们从来不觉得自己就站在圈子里。

就像冯老师遇到的这个问题一样,明明别人已经标了「BIG_KENG」了,冯老师却偏偏还要跟着 JUMP。明明已经在「坑」里了,却还信誓旦旦地说:这怎么可能会是个「坑」呢?

就像至尊宝,戴上金箍只需要一秒,而摘下来,却要一万年。

NuTGpfkzNq.jpg!large

本作品采用《CC 协议》,转载必须注明作者和本文链接
你应该了解真相,真相会让你自由。
本帖由系统于 5个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 23

原来 BIG_KENG 是大坑啊! 但还是看不出来到底是什么问题。

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前
快乐的皮拉夫 (楼主) 5个月前
徵羽宫 (作者) 5个月前
徵羽宫 (作者) 5个月前

那么 TMS_HOST 也不能用吧

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前

还有人在用 define ?

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前

感谢冯老师提供素材 :blush:

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前

这叫什么,这叫不拘小节,十年八年不看那想不起来正常.... :joy:

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前

期待冯老师下个故事

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前

冯老师不给你们计较,就这?

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前

define可以不用了 :joy:

5个月前 评论

冯老师😀

5个月前 评论

车位预约下什么时候呀呀呀呀呀,催更催更了哦。

5个月前 评论
快乐的皮拉夫 (楼主) 5个月前

这文档有意思

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!