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. 六个创建模式之建造者模式(Builder Pattern)

    定义: 将一个复杂的对象的构建与它的表示分类,使得同样的构建过程可以创建不同的表示.建造者模式一步步地创建一个复杂对象,但用户仅需指定对象的类型和内容,不需要关心各个部分之间的关联关系. 结构图: B ...

  2. Could not publish to the server. java.lang.NullPointerException

    右键单击tomcat服务器,找到Properties,点下switch location就好了.

  3. Lazyr.js – 延迟加载图片(Lazy Loading)

    Lazyr.js 是一个小的.快速的.现代的.相互间无依赖的图片延迟加载库.通过延迟加载图片,让图片出现在(或接近))视窗才加载来提高页面打开速度.这个库通过保持最少选项并最大化速度. 在线演示    ...

  4. HTML5 Canvas 高仿逼真 3D 布料图案效果

    HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大.下面给大家分享一个 HTML5 C ...

  5. document.querySelector和querySelectorAll方法

    querySelector和querySelectorAll是W3C提供的新的查询接口,其主要特点如下: 1.querySelector只返回匹配的第一个元素,如果没有匹配项,返回null.  2.q ...

  6. 解决Visual Stuido 2013中Xamarin的*.axml文件没有智能提示问题

    最近发现VS2013开发Android,发现.axml无法进行智能提示. 1.打开VS2013菜单栏中,点击工具--选项--文本编辑器--文件扩展名 2.增加一个扩展名为"axml" ...

  7. 如何:对 SharePoint 列表项隐藏 ECB 中的菜单项

    可以通过使用功能框架向编辑控制块 (ECB) 菜单添加新的自定义操作.但是,您不能使用此方法进行相反的操作,即隐藏现有的 ECB 菜单项,因为它们是通过使用 ECMAScript(JavaScript ...

  8. [Android]使用RecyclerView替代ListView(二)

    以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4242541.html 以前写过一篇“[Android]使用Adapte ...

  9. DirectX标准规定 DirectX和OpenGL的不同

    DirectX标准规定 DirectX使用左手坐标系. X轴正向指向右,Y轴正向指向上,Z轴正向垂直纸面向内. 编写Direct3D应用程序时,通常只使用4×4的矩阵和1×4的行向量,相乘时行向量在前 ...

  10. Android http 的使用

    1.okHttp https://github.com/square/okhttp 2.okhttp-utils       https://github.com/hongyangAndroid/ok ...