php global 的坑

  去年10月有个脚本任务,当时代码是复制以前的接口的,里面的几个方法有使用global全局变量,其中redis的句柄和数据库PDO连接句柄都使用了global。当时接口迁移到脚本时,直接是将代码拿来用了,没有考虑其他。因为脚本是常驻的,因此global全局变量一直拿着句柄没释放,之后就发现redis句柄中使用redis集群出现了问题:因为句柄没有释放,导致两个redis集群使用混乱。

  当时将redis的句柄修改完成后,数据库句柄还是没有改过来,昨天的时候就又出问题了。数据库句柄拿着没释放,长时间连接数据库没有操作,mysql自主的将此连接句柄给断开了,显示:mysql server has gone away。mysql数据库默认一般是28800s,即8小时。在本地环境设置超时断开时间后,可以复现:

  wait_timeout=10
  interactive_timeout=100
数据库连接超过10s后,就可以复现mysql server has gone away。mysql自主将连接断开后,即使你重连mysql,mysql依然是会拒绝连接的,相当于此句柄已经作废了。因此每次使用完句柄后,一定要将句柄释放后。
还有此脚本当捕获PDO错误后,没有异常退出,捕获后依旧continue,导致数据库问题一直没有被发现,之后做脚本的时候如果捕获到错误一定要做特殊处理,比如重连接或者异常退出,否则捕获错误是没有意义的。
当发现一个global使用错误后,没有注意除了redis句柄有问题外,数据库的是否也会有问题,举一反三能力不够,没有统筹解决能力。要学会从一个小点看到全局。
posted @ 2020-01-07 09:31  星月残雪  阅读(441)  评论(0编辑  收藏  举报