首页 > Web开发 > 详细

php global 的坑

时间:2020-01-07 11:51:47      阅读:68      评论:0      收藏:0      [点我收藏+]

  去年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句柄有问题外,数据库的是否也会有问题,举一反三能力不够,没有统筹解决能力。要学会从一个小点看到全局。

php global 的坑

原文:https://www.cnblogs.com/xingyuecanxue/p/12159722.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!