当前位置:首 页 > 技术文章 > 转载 > 详细

PHP的文件锁机制

字号字号

摘要:问题描述前几天在工作中遇到的一个问题:在ajax异步加载数据的时候,当鼠标正常滑动的时候ajax数据是正确的(AB两处数据正确对应),发现鼠标滑动过快的时候,AB两处的ajax数据会一致,也就是数据显示在A覆盖了B数据。js的原因?刚开始认识是绑定mouseover过于敏感导致,所以使用settim……

问题描述

前几天在工作中遇到的一个问题:PHP文件锁机制

在ajax异步加载数据的时候,当鼠标正常滑动的时候ajax数据是正确的(AB两处数据正确对应),发现鼠标滑动过快的时候,AB两处的ajax数据会一致,也就是数据显示在A覆盖了B数据。

js的原因?

刚开始认识是绑定mouseover过于敏感导致,所以使用settimeout来延迟鼠标滑动过快,延迟滑动过快触发ajax。但是发现一直无效。

什么原因?

在PHPajax文件处发现,当鼠标滑动过快时,php文件输出的栏目id发生异常,栏目id不一致。

最后在老大的指导下指出问题所在是php文件锁机制造成的!

首页说一下phpajax文件思路:

根据ajax请求传递的栏目id来取对应的栏目下数据,我先把一段跟栏目id有关的smarty模版写入tplstr.tpl文件里,然后在这个tpl文件解析出来的html输出。

原因:

换一个说法就是:多次请求的都对一个文件里进行:写入-》解析-》输出

滑动慢的时候:相当于串行请求写入读取,没有问题

滑动很快的时候:相当于并行请求写入读取,由于并行写入,文件没有锁机制,导致写入数据相互覆盖

解决办法

解决办法:

  • file_put_contents写入的时候加上独占锁LOCK_EX,但是这样就变成了串行请求,不能支持并发写入读取
  • 所以最好的方法:写入不同的文件里,可以支持并发

给我的启示:

  • 建议作文件缓存时,选好相关的锁,不然可能导致读取数据不完整,或重复写入数据。
  • 注意并发请求的时候
  • 添加[Admin-1]
  • 浏览[1243]
  • ▼评论[0]
这是留给你的位置,说出你的真知灼见吧![我要评论][我要收藏][我要举报]