0

0

php的咨询文件锁定:flock

php中文网

php中文网

发布时间:2016-06-13 10:56:04

|

1620人浏览过

|

来源于php中文网

原创

最近因为工作的需要在研究php,碰到了一个问题,我使用如下代码锁定一个文件句柄


[php]
$filename = "/tmp/lock.txt"; 
 
$fp = fopen($filename, "r+"); 
if (!$fp) { 
    die("open failed."); 

 
if (flock($fp, LOCK_EX)) {  // 进行排它型锁定  
    sleep(20); 
    $count = (int)fgets($fp); 
    $count += 1; 
    fseek($fp, 0); 
    fwrite($fp, (string)$count); 
    fflush($fp);            // flush output before releasing the lock  
    flock($fp, LOCK_UN);    // 释放锁定  
} else { 
    echo "Couldn't get the lock!"; 

 
fclose($fp); 
?> 

$filename = "/tmp/lock.txt";

$fp = fopen($filename, "r+");
if (!$fp) {
    die("open failed.");
}

if (flock($fp, LOCK_EX)) {  // 进行排它型锁定
    sleep(20);
    $count = (int)fgets($fp);
    $count += 1;
    fseek($fp, 0);
    fwrite($fp, (string)$count);
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // 释放锁定
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);
?>
访问,然后在sleep的20秒内尝试使用vi编辑/tmp/lock.txt,发现可以成功修改文件内容而不需要等待第一个脚本结束。经琢磨文档,发现这里有个概念叫"咨询文件锁定",就是说所有访问程序必须使用同一方式锁定才会生效, 否则它不会工作。

尝试使用如下代码在20秒内访问:


[php]
$filename = "/tmp/lock.txt"; 
 
$fp = fopen($filename, "r+"); 
if (!$fp) { 
    die("open failed."); 

 
if (flock($fp, LOCK_EX)) {  // 进行排它型锁定  
    $count = (int)fgets($fp); 
    echo $count; 
    $count += 1; 
    flock($fp, LOCK_UN);    // 释放锁定  
} else { 
    echo "Couldn't get the lock!"; 

 
fclose($fp); 
?> 

$filename = "/tmp/lock.txt";

$fp = fopen($filename, "r+");
if (!$fp) {
    die("open failed.");
}

if (flock($fp, LOCK_EX)) {  // 进行排它型锁定
    $count = (int)fgets($fp);
    echo $count;
    $count += 1;
    flock($fp, LOCK_UN);    // 释放锁定
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);
?>

发现阻塞成功(第二个脚本需要等待第一个脚本结束才能继续运行)。

那么,什么叫同一种方式锁定呢?

A组:

立即学习PHP免费学习笔记(深入)”;


1.尝试脚本1的flock参数修改为LOCK_SH,脚本2不变,试验,发现阻塞依然成功;

2.尝试脚本1和脚本2的flock参数都修改为LOCK_SH,发现脚本2会可以返回结果而不用等待脚本1执行结束;

商易网游金币收货系统
商易网游金币收货系统

照用户习惯设计的,不但挂单有序,一目了然,快捷下单方式更是方便供货商的下单流程。管理员用户密码均为admin后台功能如下:≡ 综合设置 ≡常规信息设置 网站开关设置 支持银行设置 QQ在线咨询设置 发送邮件设置 后台管理IP设置 前台锁定IP设置 网站帮助信息 网页扩展 ≡ 广告管理 ≡网站标志上传 飘浮广告 弹出广告

下载

B组:


1.尝试将脚本2的fopen参数修改为"r",现象同A组;

C组:

1.尝试将脚本2的flock参数修改为LOCK_SH,脚本1不变。

 

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号