bool flock  ( resource $handle  , int $operation  [, int &$wouldblock  ] )

handle  
文件系统指针,是典型地由 fopen()  创建的 resource (资源)。

operation  可以是以下值之一:
1. LOCK_SH 取得共享锁定(读取的程序)。  
2. LOCK_EX  取得独占锁定(写入的程序。  
3. LOCK_UN  释放锁定(无论共享或独占)。  
4.如果不希望 flock()  在锁定时堵塞,则是 LOCK_NB (Windows 上还不支持)。

wouldblock  
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE 。(Windows 上不支持)

返回值
成功时返回 TRUE , 或者在失败时返回 FALSE 。

在 PHP 5.3.2版本之前,锁也会被 fclose()  释放(在脚本结束后会自动调用),现在要解锁必须手动进行( flock ( $fp ,  LOCK_UN );// 释放锁定)。
当用一个多线程服务器 API(比如 ISAPI)时,可能不可以依靠 flock()  来保护文件,因为运行于同一服务器实例中其它并行线程的 PHP 脚本可以对该文件进行处理。(?)

eg:1
file_get_contents 和 file 有时读取一非空文件时返回空,如下例
code1锁定期间,code2输出的都是空,code3会等待code1释放锁定后返回获取的内容
code1

<?php
$fo = fopen('abc.txt', 'r+');
flock($fo, LOCK_EX);
sleep(10);
flock($fo, LOCK_UN);

code2

<?php
var_dump(file_get_contents('abc.txt'));
var_dump(file('abc.txt'));

code3

<?php
$con = getContents('abc.txt');
print_r($con); function getContents($path, $waitIfLocked = true) {
if(!file_exists($path)) {
throw new Exception('File "'.$path.'" does not exists');
}
else {
$fo = fopen($path, 'r');
$locked = flock($fo, LOCK_SH, $waitIfLocked); if(!$locked) {
return false;
}
else {
$cts = file_get_contents($path); flock($fo, LOCK_UN);
fclose($fo); return $cts;
}
}
}

eg:2
本机运行结果和下面的不一致,LOCK_SH时能写入(???)
下面的是手册上的例子
I just spend a long time to understand why write function returns me "0", on a basic file opening and then writing.
I discovered that if you use LOCK_SH and then you write something, that will not work :

<?php
$fp = fopen('file.txt', 'a'); flock($fp,LOCK_SH); $written = fputs($fp, 'data'); var_dump($written); // 0 and file is not changed fclose($fp);

eg:3
写​代​码​来​解​决​多​进​程​线​程​同​时​读​写​一​个​文​件​的​问​题:
PHP是没有多线程概念的,尽管如此我们仍然可以用“不完美”的方法来模拟多线程。
简单的说,就是队列处理。通过对文件进行加锁和解锁,来实现。当一个文件被一个用户操作时,
该文件是被锁定的,其他用户只能等待,确实不够完美,但是也可以满足一些要求不高的应用

<?php
function T_put($filename,$string){
$fp = fopen($filename,’a'); //追加方式打开
if (flock($fp, LOCK_EX)){ //加写锁
fputs($fp,$string); //写文件
flock($fp, LOCK_UN); //解锁
}
fclose($fp);
} function T_get($filename,$length){
$fp = fopen($filename,’r'); //追加方式打开
if (flock($fp, LOCK_SH)){ //加读锁
$result = fgets($fp,$length); //读取文件
flock($fp, LOCK_UN); //解锁
}
fclose($fp);
return $result;
}

flock — 轻便的咨询文件锁定的更多相关文章

  1. 015PHP文件处理——文件处理flock 文件锁定 pathinfo realpath tmpfile tempname

    <?php /**文件处理flock 文件锁定 pathinfo realpath tmpfile tempname */ /*$arr=pathinfo('ab.txt');//获取文件路径的 ...

  2. Linux数据管理——文件锁定

    一.什么是文件锁定 对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,就是阻止某些人做某些事,例如,门锁就是阻止除了屋主 ...

  3. Linux学习笔记14——使用fcntl实现文件锁定

    期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...

  4. PHP文件锁定写入实例分享

    PHP文件锁定写入实例解析. 原文地址:http://www.jbxue.com/article/23118.html PHP文件写入方法,以应对多线程写入,具体代码: function file_w ...

  5. PHP文件锁定机制

    <?php //如果多用户访问一个文件,采用文件锁定机制 /* flock()文件锁定 */ header("Content-Type:text/html;charset=utf8&q ...

  6. PC问题-VMware Workstation出现“文件锁定失败”

    问题现象:电脑关机时挂起VMware Workstation后,第二天运行VMware Workstation出现“文件锁定失败”. 问题原因:在WIN的目录中有*.LCK文件,此文件是用来锁定当前虚 ...

  7. (转)NIO 文件锁定

    文件锁定 概述 文件锁定初看起来可能让人迷惑.它 似乎 指的是防止程序或者用户访问特定文件.事实上,文件锁就像常规的 Java 对象锁 ― 它们是 劝告式的(advisory) 锁.它们不阻止任何形式 ...

  8. PHP flock() 函数 php中的文件锁定机制

    举一个例子: 假设一个文件读取的过程,有数万人在同时操作,那么极可能a用户刚刚写入,b用户也写入了,两者以至于混乱,或者在读取的时候,读取到别人写的数据.就好比上公共厕所,去厕所的时候要把门给打开上, ...

  9. Asp文件锁定脚本

    锁定指定文件 <% on error resume next server.ScriptTimeout= response.write "<form method=post> ...

随机推荐

  1. Android应用开发基础之十:多媒体编程

    多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...

  2. Visual Studio Code 使用 Typings 实现智能提示功能

    前言 我们知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也有一些简单的提示,但这是通过代码片段提供的.功能上远不能和IDE相比.不过最近兴起的文本编辑器的新锐 Visual Studio ...

  3. Strip JS – 低侵入,响应式的 Lightbox 效果

    Strip  是一个灯箱效果插件,显示的时候只会覆盖部分的页面,这使得侵扰程度较低,并留出了空间与页面上的大屏幕,同时给予小型移动设备上的经典灯箱体验.Strp JS 基于 jQuery 库实现,支持 ...

  4. Mithril – 构建杰出 Web 应用的 JS MVC 框架

    Mithril 是一个客户端的 Javascript MVC 框架.它是一个工具,使应用程序代码分为数据层,UI 层和粘合层.提供了一个模板引擎与一个虚拟的 DOM diff 实现,用于高性能渲染,支 ...

  5. Python的下载与安装

    linux系统由于自身的需要,自带了Python,而Windows的系统就没有自带Python.本篇Blog介绍在win8.1下,安装Pathon需要注意的问题,包括常见的0x80240017.250 ...

  6. 【HTML5】HTML5本地数据库(Web Sql Database)

    Web Sql数据库简介 Web SQL数据库API实际上不是HTML5规范的组成部分,而是单独的规范.它通过一套API来操纵客户端的数据库. Web SQL数据库的浏览器支持情况 Web SQL 数 ...

  7. Linux新手扫盲

    一. Linux特点 1.免费/开源: 2.支持多线程/多用户: 3.安全性好: 4.对内存和文件管理优越. Linux最小只需4M ——> 嵌入式开发 二. 文件目录 Linux系统所有软硬件 ...

  8. 【Leafletjs】6.Control.Loading推展-在地图上边框添加加载动态条

    在已有的Control.Loading控件基础上结合CSS3 animation属性实现 .nz-loading .nz-loader { display: block; -webkit-animat ...

  9. RapidFloatingActionButton框架正式出炉

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4474748.html RapidFloatingActionB ...

  10. UIApplicationDelegate

    App受到干扰时,UIApplication会通知它的delegate对象,让delegate处理系统事件. 项目中的AppDelegate已经遵守了UIApplicationDelegate协议   ...