Skip to content

Instantly share code, notes, and snippets.

@liuxd
Last active June 18, 2021 04:12
Show Gist options
  • Select an option

  • Save liuxd/d061e35eef2a332c6313b628e2b20697 to your computer and use it in GitHub Desktop.

Select an option

Save liuxd/d061e35eef2a332c6313b628e2b20697 to your computer and use it in GitHub Desktop.
[Bugs] #Tips

Bug记录

代码Bug

  • parse_ini_file(),对于parse_ini_file这个函数来说,ini文件的配置项不加引号的on会被解释为字符串的"1",而同样不加引号的off会被解释为""(空字符串)!2014
  • Memcache::add(),过期时间最多只能设为30天,如果超过这个限制,memcached将不会缓存,但是函数仍然会返回true。2014
  • job的对游标文件的读写没有进行过滤和类型转换,导致错误的记录信息,和错误的读取,甚至有sql注入的危险。2014
  • 设置缓存时写成数组累加的样子,而不是覆盖。导致要缓存的数组越来越大,引起内存爆表。2014
  • 提炼公共函数,没有把原来文件里的函数删掉,导致redeclare错误。2014
  • 数据处理包含了去重逻辑。在单进程是去重是没问题的,但是简单的划分成多进程后,最终结果的去重就不对了。2015
  • mysql_unbuffered_query()如果与buffered的语句交替执行,会丢数据,但不会报错。2015
  • mysql_connect()当链接参数相同时就返回同一个句柄,无论实例化多少次都一样。除非使用第四参数。2015
  • mysql创建联合唯一性索引,有长度限制。如果索引字段之一是字符串,且设置的索引长度小于字符串长度,并且入库操作使用replace,则前面索引长度内相同而后面部分不同的数据会相互覆盖,导致数据错误。2015
  • 导入文本文件,没有注意编码。导致文字都无法识别。2015
  • $(ranking_list).appendTo('#ranking_list');这段jQuery代码的问题是新创建html元素的字符串的变量ranking_list与宿主元素的idrankding_list重名了。导致新加入的元素没有样式。2015-03-15
  • 被动接收微信推送消息的代码中,如果不需要返回XML信息的话,就返回一个空字符串。不要返回各种奇怪的nulltrue/false、数字或字符串等信息,微信都会按XML来解析,如果解析不了就会认为返回值错误。虽然不会影响业务,但是监控公众号会持续报警,非常讨厌。2016-04-18
  • 根据时间导出数据的功能。页面设定开始、结束日期,将导出任务插入数据库,脚本根据数据库日期进行导出。因为结束日期没有做“加一天”处理,导致导出的数据范围是“开头闭区间,结尾开区间”,丢掉结束时间那一天的数据。合理做法是在插入数据库时就将结束日期加一天。2016-12-07
  • php运行lua程序并运行$lua->assign($field, $value);时,Nginx返回HTTP 502了。因为$field是一个数字,而不是合法的变量标识符。解决方案很简单——给变量一个正确合法的名字。2018-03-29
  • HTML元素ID起的太长,超过了限制。导致jQuery无法正常操作元素。ID长度限制一般在8-13左右。2018-11-22
  • dom A应该插入到dom B,但是某种情况下,dom B渲染完成时间稍晚于dom A,导致插入失败并报错,功能受影响。解决方案是将插入操作延迟50ms,问题解决。2019-01-23
  • 两个tab里的grid是基于vue-table-2生产的。当切换tab时,后一个tab的grid会丢失filters。解决方案是用setTimeout来延迟10ms显示grid。2019-02-22
  • 一个大SQL里有个复杂的、经过组合得到的字段ContactInfo,明明应该有值,但是结果总是空的。原因:该字段真实值在后面被'' AS ContactInfo的临时逻辑给覆盖了。 2019-07-02
  • SilverStripe Dropdown and jquery.validation are used together, causing the error message appearing above the dropdown instead of below it which looks different from other fields. Root cause is SilverStripe Dropdown actually generates a <div> with <select> and <span> in it, <select> first, <span> is for better UI. The jquery.validation puts the error message below the targeted element, which is the <select> in this case, so it is actually above the <span> on UI. Solution is to exchange the position of the two elements after loading the page. 2021-05

部署Bug

  • LB没有把所有后端用到的头信息传递给app机器,导致app没有走varnish。2013
  • varnish没有对302、404、500等做跳过处理,导致缓存了这些错误的结果页面。某些错误码下要跳过varnish。2013
  • 页面js里面的一个URL做了修改,但老的URL被varnish缓存了,但后端已经没有这个URL的识别,导致404错误。页面内url变更要清理页面缓存。2013
  • 某台app机器的PHP内存设置比其他机器小了,导致图片处理报错,而且错误结果被squid缓存住了。app环境配置要一致,报错页面不应该缓存,报错信息应该封装,不要暴露服务器信息。2013
  • nginx + php-fpm遇到502问题。分别查看nginx、php、php-fpm的error_log,如果发现:child exited on signal 11,说明php-fpm的worker进程处理请求失败了。最终解决是注释掉了一堆没用的扩展。2014
  • nginx error “conflicting server name” ignored 怎么找都找不到,最后发现是 default~ 这个gedit产生的临时文件导致的。(如果include的时候限制扩展名的话就没这个问题了。)2013
  • mysql不定时的抽风,processlist显示超多进程,然后反应超慢。其实表数据很少,索引也合理,大多数时候都很快,但这抽风是为什么呢?原来是redis和mysql在同一台物理机,redis向磁盘写入时造成磁盘IO资源耗尽,间接影响了mysql。2015
  • 脚本在线下测试是完美的,一上线却没有跑出数据。原因是相关数据文件被放在了一个在发布时被忽略的文件夹,导致这个重要的文件没有发布到线上,于是脚本的结果就杯具了。2014
  • Heroku dynamically assigns your app a port, so you can't set the port to a fixed number which it looks like your doing at PORT: '43760'. Use port = int(os.environ.get("PORT", 5000)) instead.

流程Bug

  • 同步线上信息的时候没有先pull,而是直接修改本地副本并覆盖线上内容。导致滞后信息覆盖线上正确的信息,造成404问题。2014
  • 业务下线,但相关监控没停,导致收到报警。2014
  • 在Github上提交PR的时候,只检查了项目master里的状态,没有看等待中的PR队列。以至于提交了重复的PR。而且,项目主页写错了,写成了开发者博客页。其实那个开发者的项目不只那一个。不要只看代码,还要多看看PR和Issue,参与讨论。
  • 微信的access_token是同时只能有一个有效的,产生新的后,老的就失效了。需要缓存住,否则请求容易达到请求限制。线下使用了正式环境的APP_ID生成token后回导致线上环境缓存里的token失效。2017
  • PHP写的API在本地和预发布都完好,一上线却偶尔返回会空白,是偶尔。于是开始排查问题,排查代码是否正确同步,排查线上配置是否正确,排查APP机器与Redis实例之间的网络是否通畅。通过绑hosts逐台测试,最终发现有一台机器无法正确响应。准备查看错误日志,没开,那开启错误日志重启进程吧,于是发现PHP的worker产生僵尸进程了!!!进程还在,但是已经不干活了。PHP重启后就正常工作了。2015-12-07
  • 微信的网页授权使用的code是一次性的。我在绑定账号的功能中使用了此code,可是检查的时候用了该code后,该code就失效了,再之后的实际绑定动作中无法获得用户信息导致绑定无法成功。一次性的这种信息一定不要同时用于检查和操作,第一次的使用导致其失效,第二次的操作就完全无法成功了。2015-12-15
  • 测试微信按组群发消息的接口,把用户组ID传错了,导致106万用户收到测试消息。在构造有可能传达给用户的消息时一定要经过设计,确保即使发错了也不会产生不好的用户体验。2016-01-27
  • 线上代码请求推送服务发送微信模板消息,但是无法推送成功。经调查发现没有把请求方服务器的IP加入到服务的白名单中,导致无法发送成功。2016-04-20
  • 部署测试环境发现验证码图片无法显示。原因是创建了仅包含<?php的配置文件,造成输出<?php而污染了buffer。这个文件要求必须存在但不一定要有内容。解决办法是随便加点空行就可以了。2016-06-22
  • 部署京东云测试环境。终端里可以pinghttp://notify.fruitday.com,通过curl也可以获得正确的返回值,但是PHP代码里通过stream_context_create + file_get_contents的方式请求接口的http://notify.fruitday.com时候却会说找到不到该域名。解决办法是在机器上增加hosts配置,写明域名对应的IP。
  • 由于处理合并冲突时取舍不当,导致功能丢失。2018-10-02
  • 调试build脚本时,由于路径参数调整错误,本地项目文件夹被rm -rf了。幸好大部分修改都push到远端了,否则这些都得重做。2018-11-06

虚假Bug

  • 可恶的后台进程
    • 期望:页面上一个Supplier的计划变更时,它产品的两个数据列应该被更新。这是个简单的Update语句就可以实现的问题。
    • 现象:有39条数据总是不按照期望变化,只有DateMap那列在不断更新。
    • 原因:有个后台进程在做相关计算。当这些数据被更新后,马上又会被后台进程计算并更新。由于后台进程计算的结果和原来一样,所以看起来数据就像没变过一样。而DateMap的持续更新正说明数据是再次被覆盖更新了的,而非没有变化。2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment