近来公司某个域名流量大涨,发现一个外部QQ登录的接口经常失败,用户登录总是不成功。经过排查发现是登录的第一步需要保存一个token_secret。当时的程序员编写此代码时直接用了$_SESSION来保存token_secret。这里在并发量小时问题不大,并发大了之后极有可能会出问题。
假设A,B两个请求同时出发,A,B同时session_start,读取到了一个$_SESSION的值。当A完成请求写入$_SESSION,但B还没有完成请求,B完成请求后再写$_SESSION,就会覆盖A所设置的值。
类似的数据同步问题其实很多的,比如file_put_contents写PHP的Cache文件,如果不加LOCK_EX就可能会存在同步问题,当一个进程写file时,只写到一半有另外的进程去require此文件,这时就会因为文件不完整,导致PHP语法错误。所以涉及到同时读写同一个文件或数据时一定要加锁,否则在高并发的情况下会产生严重错误。
来自韩天峰兄弟的博客:http://rango.swoole.com/archives/74
假设A,B两个请求同时出发,A,B同时session_start,读取到了一个$_SESSION的值。当A完成请求写入$_SESSION,但B还没有完成请求,B完成请求后再写$_SESSION,就会覆盖A所设置的值。
类似的数据同步问题其实很多的,比如file_put_contents写PHP的Cache文件,如果不加LOCK_EX就可能会存在同步问题,当一个进程写file时,只写到一半有另外的进程去require此文件,这时就会因为文件不完整,导致PHP语法错误。所以涉及到同时读写同一个文件或数据时一定要加锁,否则在高并发的情况下会产生严重错误。
来自韩天峰兄弟的博客:http://rango.swoole.com/archives/74
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/6911/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表