搜索
查看: 1732|回复: 0

PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

[复制链接]

5378

主题

5381

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17641
发表于 2018-2-11 12:14:30 | 显示全部楼层 |阅读模式

            文件锁
全名叫 advisory file lock, 书中有提及。 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁。
这个锁可以防止重复运行一个进程,例如在使用crontab时,限定每一分钟执行一个任务,但这个进程运行时间可能超过一分钟,如果不用进程锁解决冲突的话两个进程一起执行就会有问题。
使用PID文件锁还有一个好处,方便进程向自己发停止或者重启信号。例如重启php-fpm的命令为
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
发送USR2信号给pid文件记录的进程,信号属于进程通信,会另开一个篇幅。
php的接口为flock,文档比较详细。先看一下定义,bool flock ( resource $handle , int $operation [, int &$wouldblock ] ).

  
  • $handle是文件系统指针,是典型地由 fopen() 创建的 resource(资源)。这就意味着使用flock必须打开一个文件。
      
  • $operation 是操作类型。
      
  • &$wouldblock 如果锁是阻塞的,那么这个变量会设为1.

    需要注意的是,这个函数默认是阻塞的,如果想非阻塞可以在 operation 加一个 bitmask LOCK_NB. 接下来测试一下。
    $pid_file = "/tmp/process.pid";
    $pid = posix_getpid();
    $fp = fopen($pid_file, 'w+');
    if(flock($fp, LOCK_EX | LOCK_NB)){
      echo "got the lock \n";
      ftruncate($fp, 0);   // truncate file
      fwrite($fp, $pid);
      fflush($fp);      // flush output before releasing the lock
      sleep(300); // long running process
      flock($fp, LOCK_UN);  // 释放锁定
    } else {
      echo "Cannot get pid lock. The process is already up \n";
    }
    fclose($fp);
  • 长春网站建设 网站设计 www.4435.cn 电话:136 2446 7185(于先生)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    长春门户网站

    长春门户网是网民了解长春的网络窗口,同是提供长春地区百姓生活分类供求信息的门户网站,同时提供长春网站建设、长春网站设计,我们将逐步的完善网站分类信息资源;

    长春门户网二维码

    联系我们

    • 工作时间:早上8:00 - 晚上5:30
    • 投稿联系:13624467185(微信同号)
    • 反馈邮箱:5053050@QQ.com
    • 公司地址:吉林省长春市亚泰大街与自由大路交汇五环国际大厦1408室

    QQ|小黑屋|手机版|Archiver|CCZCC! ( 吉ICP备2021009740号-8 )

    Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表