您的位置:首页 > 运维架构 > Apache

PHP安全之 apache多进程编码需注意的地方

2015-11-16 23:28 453 查看
最近在做一个项目的过程中,由于测试服务器网络卡慢,并且项目组成员为了测试程序很多成员用同个帐号来测试程序,我主要负责红包的发放代码的开发,当一切都功能代码都自以为写的已经完美无缺了,自己就休闲的去看一些自己感兴趣的游戏开发方面的技术教程去了,把代码上传测试服务器,交由测试人员去检测去了,刚开始测试人员也没有发现什么问题,不过过了一段时间,测试人员反应红包有重复发放的问题,然后自己就按他的方法重新测试了一遍并没有发现出现他说的那种情况,来回测试了好几遍都没有找到原因,关键的是BUG并没有复现,自己又仔细检查了好几遍代码的逻辑,也没有发现有错误。就开始怀疑是不是有其它开发人员手动修改了数据库,造成了这种原因。不过这个问题第二天又出现了,可是再怎么模拟也没有出现这样的BUG。头慢慢开始大了!可是这个问题是绝对不能允许出现的,红包可是实实在在的钱呀,万一出现任何闪失都是不行的!各种分析,在自己测试代码的过程中也在一起抱怨这个该死的测试服务器连接数据库也太慢了,太影响开发效率了,心情更加有点郁闷了。。。
想想是不是自己头脑有些大了,再说是自己写的代码,自己也没好找出问题来,“当局者迷,旁观者清”,不行找个人来帮我看下自己的代码有没有问题,就再我和另一个程序员来说这个代码的问题时,自己开始有点怀疑的靠谱的原因了,自己就和他叨叨到“是不是网络的问题”,因为红包的执行插入的代码是依靠检测之前的插入日志来进行判断是否需要插入对应的红包记录的,是不是在查询日志后发现没有对应的记录,代码进入插入红包的操作(因为一次性插入红包的行数达到100多个),然后是记录对应的日志,可是由于网络太慢A操作端还没来得及插入对应的记录,B操作端用了同样一个帐号来进行同样的操作,也同样触发了插入红包的事件,代码此时也同样是查询数据库发现没有对应的日志,也会同样执行插入红包的代码
,就样就会出现之前那种重复插入的问题。好吧,接下来就把自己的推断用实际操作来复现下,于是和另外一个程序员来同时用同一个帐号来触发红包插入的事件,果然BUG复现了。只要能找到BUG出现的方法,问题基本上就知道怎么解决了。于是就先把插入日志的代码提前,放在红包插入之前。再测试问题没了。不过虽然在人为模拟的情况下没有再出现BUG,但理论上还是会现出重复插入的可能的,因为实际上这里存在一个类似于“CPU执行时间片调度的问题或者说代码同步的问题。

$log = 从数据库里取出对应插入记录
// 代码执行到此,CPU有可能出现中断此进程的代码,去执行其它进程的代码
if(!$log)
{
//插入红包代码
// 由于此处代码执行插入记录很多出现CPU中断的情况可能很大
}


apche是多进程的,当有多个HTTP请求过来时,会生成多个进程来处理用户的请求,这样就难免会造成逻辑代码同步的问题,尤其是在网络延迟比较大的情况下,所以以后开发的代码的过程中要多考虑这种情况,尤其是在执行插入操作需要依赖检查某个条件时的情况下。为了解决上面的理论上可能会出现的情况,最后还是在数据表里对应建立了唯一索引,这样就避免了万一极端情况出现了时间片调度的问题,也不至于插入重复记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: