主页 > PHP教程 > 正文

再说PHP文件锁,同享锁和排它锁留意点

文件锁有两种:同享锁和排他锁,也便是读锁(LOCK_SH)和写锁(LOCK_EX) 

文件的锁一般这么运用:

$fp = fopen("filename", "a");   
flock($fp, LOCK_SH) or die("lock error")   
$str = fread($fp, 1024);   
flock($fp, LOCK_UN);   
fclose($fp);

留意fwrite之后,文件当即就被更新了,而不是等fwrite然后fclose之后文件才会更新,这个能够经过在fwrite之后fclose之前读取这个文件进行检查

可是什么时分运用lock_ex什么时分运用lock_sh呢? 

读的时分:

假如不想呈现dirty数据,那么最好运用lock_sh同享锁。能够考虑以下三种状况: 

1. 假如读的时分没有加同享锁,那么其他程序要写的话(不论这个写是加锁仍是不加锁)都会当即写成功。假如正好读了一半,然后被其他程序给写了,那么读的后一半就有或许跟前一半对不上(前一半是修正前的,后一半是修正后的) 

2. 假如读的时分加上了同享锁(由于仅仅读,没有必要运用排他锁),这个时分,其他程序开端写,这个写程序没有运用锁,那么写程序会直接修正这个文件,也会导致前面相同的问题 

3. 最理想的状况是,读的时分加锁(lock_sh),写的时分也进行加锁(lock_ex),这样写程序会等着读程序完结之后才进行操作,而不会呈现轻率操作的状况 

写的时分:

假如多个写程序不加锁一起对文件进行操作,那么最终的数据有或许一部分是a程序写的,一部分是b程序写的 

假如写的时分加锁了,这个时分有其他的程序来读,那么他会读到什么东西呢? 

1. 假如读程序没有恳求同享锁,那么他会读到dirty的数据。比方写程序要写a,b,c三部分,写完a,这时分读读到的是a,持续写b,这时分读读到的是ab,然后写c,这时分读到的是abc. 

2. 假如读程序在之前恳求了同享锁,那么读程序会等写程序将abc写完并开释锁之后才进行读。


上一篇:PHP文件读写锁的问题详解
下一篇:PHP CURL中传递cookie的办法

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854