PHP对文件进行加锁、解锁实例

这篇文章主要介绍了PHP对文件进行加锁、解锁实例,本文直接给出实现代码和代码的使用方法,需要的朋友可以参考下

有时候你的php脚本或许需要线程安全的保证,比如进行文件写操作的时候。本文提供了文件加锁函数以及使用示例。文件加锁功能也可以用来获得独享的处理空间,防止脚本执行发生同步错误,代码如下:

  1. <?php
  2. /*************************************************************************
  3. *file lock
  4. *@author Zeal Li
  5. *http://www.zeali.net/
  6. *
  7. *************************************************************************/
  8. /*
  9. *lock_thisfile:获得独享锁
  10. *@param $tmpFileStr 用来作为共享锁文件的文件名(可以随便起一个名字)
  11. *@param $locktype 锁类型,缺省为false(非阻塞型,也就是一旦加锁失败则直接返回false),设置为true则会一直等待加锁成功才返回
  12. *@return 如果加锁成功,则返回锁实例(当使用unlock_thisfile方法的时候需要这个参数),加锁失败则返回false.
  13. */
  14. function lock_thisfile($tmpFileStr,$locktype=false){
  15. if($locktype == false)
  16. $locktype = LOCK_EX|LOCK_NB;
  17. $can_write = 0;
  18. $lockfp = @fopen($tmpFileStr.".lock","w");
  19. if($lockfp){
  20. $can_write = @flock($lockfp,$locktype);
  21. }
  22. if($can_write){
  23. return $lockfp;
  24. }
  25. else{
  26. if($lockfp){
  27. @fclose($lockfp);
  28. @unlink($tmpFileStr.".lock");
  29. }
  30. return false;
  31. }
  32. }
  33. /**
  34. *unlock_thisfile:对先前取得的锁实例进行解锁
  35. *@param $fp lock_thisfile方法的返回值
  36. *@param $tmpFileStr 用来作为共享锁文件的文件名(可以随便起一个名字)
  37. */
  38. function unlock_thisfile($fp,$tmpFileStr){
  39. @flock($fp,LOCK_UN);
  40. @fclose($fp);
  41. @fclose($fp);
  42. @unlink($tmpFileStr.".lock");
  43. }
  44. ?>
  45. <?php
  46. // 使用举例
  47. $tmpFileStr = "/tmp/mylock.loc";
  48. // 等待取得操作权限,如果要立即返回则把第二个参数设为false.
  49. $lockhandle = lock_thisfile($tmpFileStr,true);
  50. if($lockhandle){
  51. // 在这里进行所有需要独占的事务处理。
  52. // ... ...
  53. // 事务处理完毕。
  54. unlock_thisfile($lockhandle,$tmpFileStr);
  55. }
  56. ?>