您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
文件的基本操作与文件的锁机制
发布时间:2018-04-30 10:34:50编辑:雪饮阅读()
文件的基本操作
<?php
//pathinfo可以获取一个文件的文件信息,以数组的形式呈现,包括目录名、文件名、扩展名、纯文件名(不包含扩展名)
/*
$arr=pathinfo("swoole_xhcf.php");
echo "<pre>";
print_r($arr);
*/
//realpath可以将相对路径转换为绝对路径
//echo realpath("swoole_xhcf.php");
//获取当前文件的绝对路径
//echo __FILE__;
//获取当前文件的绝对路径(路径只达当前文件的直接父级目录)
//echo dirname(__FILE__);
//以读写的方式打开文件并写入内容(在文件开头开始)
/*
$file=fopen("test.txt","r+");
//将内容写入到文件指针处,若此处有字符则逐个替换直到待写入的字符写完为止
fwrite($file,"杜敏捷");
fclose($file);
*/
/*
产生随机临时文件tmp,保证不重名
其返回值就是文件的绝对路径(包含文件完整名)
这个随机的文件是永久存在的除非你自己删除掉他
*/
/*
$file=tempnam(".","dmj");
echo $file;
*/
//tmpfile函数也可以生成临时文件,只不过他是直接生成的可操作的文件句柄
//当关闭脚本或fclose后文件就会立即消失
$file=tmpfile();
fwrite($file,"xydmj");
//rewind() 函数将文件指针的位置倒回文件的开头。参数必需。规定已打开的文件。
rewind($file);
/*
fpassthru() 函数输出文件指针处的所有剩余数据。
该函数将给定的文件指针从当前的位置读取到 EOF,并把结果写到输出缓冲区。
*/
fpassthru($file);
fclose($file);
文件的共享锁
<?php
//文件锁
$filePath="test.txt";
$file=fopen($filePath,"r+");
//开启文件只读锁(共享锁),只有在fclose后或者LOCK_UN或者该脚本结束时才能解锁
/*
共享锁解析:
不仅别的脚本在锁期间无法写入,就连本脚本在未解锁前的写入脚本都是无效的
*/
$a="";
flock($file,LOCK_SH);
/*
此处若用fread就会造成一个bug,若在未解锁前读取的话,那么接下来的写入就会生效
使用共享锁LOCK_SH,如果是读取,不需要等待,但如果是写入,需要等待读取完成。
读取完了 所以写入了
*/
//$a= fread($file,filesize($filePath));
fwrite($file,"lock1 ");
sleep(10);
//文件解锁
flock($file,LOCK_UN);
fclose($file);
echo $a;
文件的独占锁
<?php
//文件锁
$filePath="test.txt";
$file=fopen($filePath,"r+");
//开启文件写锁(独占锁),只有在fclose后或者LOCK_UN或者该脚本结束时才能解锁
/*
独占锁解析:
仅仅本脚本在锁期间可以写入,其它脚本则需要等待解锁才可以
*/
flock($file,LOCK_EX);
fwrite($file,$_GET["xy"]);
sleep(10);
//文件解锁
flock($file,LOCK_UN);
fclose($file);
文件锁的阻塞性
<?php
//文件锁的阻塞性
//什么叫堵塞,这是进程的术语,即多个进程对同一个文件进行独占锁定操作,其它的则被堵塞了
$filePath="test.txt";
$file=fopen($filePath,"r+");
/*
这里虽然判断了如果阻塞了就直接输出文件锁定的提示
但是当该脚本被访问2次,时间很相近,还在sleep结束前就再次访问该脚本仍然再次锁定
正确的逻辑是如果发现锁定就直接输出文件锁定的提示才对
*/
if(flock($file,LOCK_EX)){
fwrite($file,$_GET["xy"]);
sleep(10);
//文件解锁
flock($file,LOCK_UN);
}
else{echo "文件已锁定不可写入内容";}
fclose($file);
文件锁阻塞问题的解决
<?php
//文件锁的阻塞性
$filePath="test.txt";
$file=fopen($filePath,"r+");
/*
在lock上加上LOCK_NB可借鉴加锁所造成的阻塞性
当然,因为Windows系统没有进程堵塞之说,所以,LOCK_NB在Windows服务器下不被支持。
*/
if(flock($file,LOCK_EX+LOCK_NB)){
fwrite($file,"xydmj");
sleep(10);
//文件解锁
flock($file,LOCK_UN);
}
else{
echo "文件已锁定不可写入内容";
}
fclose($file);
关键字词:文件,锁