为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态.作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争.假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有序的写入数据,不加锁的情况下会发生什么?多次有序的写入操作相当于一个事务,我们此时需要保证这个事务的完整性.
bool flock ( int handle, int operation [, int &wouldblock] );
flock() 操作的 handle 必须是一个已经打开的文件指针.operation 可以是以下值之一:
1.要取得共享锁定(读取程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)
2.要取得独占锁定(写入程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)
3.要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)
4.如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)
建两个文件
实例代码如下:
(1) a.php
- ?$file = "temp.txt";
- $fp = fopen($file , 'w');
- if(flock($fp , LOCK_EX)){
- fwrite($fp , "abcn");
- sleep(10);
- fwrite($fp , "123n");
- flock($fp , LOCK_UN);
- }
- fclose($fp);
(2) b.php
- ?$file = "temp.txt";
- $fp = fopen($file , 'r');
- echo fread($fp , 100);
- fclose($fp);
运行 a.php 后,马上运行 b.php ,可以看到输出:
abc
等 a.php 运行完后运行 b.php ,可以看到输出:
abc
123
显然,当 a.php 写文件时数据太大,导致时间比较长时,这时 b.php 读取数据不完整
修改 b.php 为:
实例代码如下:
- ?$file = "temp.txt";
- $fp = fopen($file , 'r');
- if(flock($fp , LOCK_EX)){
- echo fread($fp , 100);
- flock($fp , LOCK_UN);
- } else{
- echo "Lock file failed…n";
- }
- fclose($fp);
运行 a.php 后,马上运行 b.php ,可以发现 b.php 会等到 a.php 运行完成后(即 10 秒后)才显示:
读取数据完整,但时间过长,他要等待写锁释放.修改 b.php 为:
实例代码如下:
- ?$file = "temp.txt";
- $fp = fopen($file , 'r');
- if(flock($fp , LOCK_SH | LOCK_NB)){
- echo fread($fp , 100);
- flock($fp , LOCK_UN);
- } else{
- echo "Lock file failed…n";
- }
- fclose($fp);
运行 a.php 后,马上运行 b.php ,可以看到输出:
Lock file failed…
证明可以返回锁文件失败状态,而不是向上面一样要等很久.
结论:
建议作文件缓存时,选好相关的锁,不然可能导致读取数据不完整,或重复写入数据.file_get_contents 好像选择不了锁,不知道他默认用的什么锁,反正和不锁得到的输出一样,是不完整的数据.
我是要做文件缓存,所以只需要知道是否有写锁存在即可,有的话就查数据库就可以了.多次同时执行,虽然都写了100行,但是事务1和事务2的数据交错写入,这并不是我们想要的结果.我们要的是事务完整的执行,此时我们需要有个机制去保证在第一个事务执行完后再执行第二个.在PHP中,flock函数完成了这一使命.在事物1和事务2的循环前面都加上: flock($fp, LOCK_EX); 就能满足我们的需求,将两个事务串行.
当某一个事务执行完flock时,因为我们在这里添加的是LOCK_EX(独占锁定),所以所有对资源的操作都会被阻塞,只有当事务执行完成后,后面的事务才会执行.我们可以通过输出当前的时间的方法来确认这一点.
关于在尾部追加写入,在unix系统的早期版本中存在一个并发写入的问题,如果要在尾部追加,需要先lseek位置,再write.当多个进程同时操作时,会因为并发导致的覆盖写入的问题,即两个进程同时获取尾部的偏移后,先后执行write操作,后面的操作会将前面的操作覆盖.这个问题在后面以添加打开时的O_APPEND操作而得到解决,它将查找和写入操作变成了一个原子操作.
在PHP的fopen函数的实现中,如果我们使用a参数在文件的尾部追加内容,其调用open函数中oflag参数为 O_CREAT|O_APPEND,即我们使用追加操作不用担心并发追加写入的问题.
在PHP的session默认存储实现中也用到了flock文件锁,当session开始时就调用PS_READ_FUNC,且以O_CREAT | O_RDWR | O_BINARY 打开session数据文件,此时会调用flock加上写锁,如果此时有其它进程访问此文件(即同一用户再次发起对当前文件的请求),就会显示页面加载中,进程被阻塞了.加写锁其出发点是为了保证此次会话中对session的操作事务能完整的执行,防止其它进程的干扰,保证数据的一致性.如果一个页面没有session修改操作,可以尽早的调用session_write_close()释放锁.
文件锁是针对文件的锁,除了这种释义,还可以理解为用文件作为锁.在实际工作中,有时为确保单个进程的执行,我们会在程序执行前判断文件是否存在,如果不存在则创建一个空文件,在进程结束后删除这个空文件,如果存在,则不执行.
但是什么时候使用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 flock文件锁详解介绍
order levaquin for sale buy levaquin 500mg pill
avodart 0.5mg oral order celecoxib 200mg ondansetron 4mg ca
aldactone 100mg sale cost valacyclovir buy fluconazole 200mg online cheap
ampicillin 500mg sale purchase cephalexin without prescription erythromycin 500mg without prescription
buy sildenafil 100mg pill careprost uk purchase methocarbamol pills
buy suhagra generic sildenafil 50mg estrace pill
order lamictal 200mg pill buy tretinoin gel order tretinoin gel sale
buy tadalis 10mg diclofenac cheap purchase diclofenac online
order indocin 75mg pill lamisil pill buy trimox sale
order cialis 20mg Usa pharmacy viagra sildenafil price
arimidex 1mg over the counter viagra 50mg side effects viagra cheap
buy deltasone sale viagra sildenafil 25mg sildenafil ca
tadalafil 10mg kaufen ohne rezept cialis 20mg bestellen sildenafil 50mg bestellen
altace 5mg over the counter order ramipril 5mg online cheap buy azelastine 10ml sprayers
clonidine 0.1 mg drug antivert tablet order generic spiriva 9 mcg
buy generic terazosin 1mg buy hytrin online cheap order generic sulfasalazine 500mg
buy benicar 10mg pills diamox generic cost acetazolamide 250 mg
order prograf 1mg for sale urso ca order ursodiol 150mg for sale
cost imdur 40mg order imuran 50mg without prescription buy micardis 80mg generic
order molnupiravir 200 mg sale buy naproxen 250mg sale order prevacid without prescription
buy zoloft 100mg generic Best price for viagra purchase viagra online cheap
order cialis 10mg for sale tadalafil 10mg cost sildenafil 100mg for sale
buy revia 50mg pill abilify for sale buy generic abilify
provera order online periactin 4 mg cost periactin 4mg us
accutane 40mg over the counter order amoxil 250mg deltasone 5mg price
zithromax online buy neurontin 600mg generic cheap neurontin tablets
order generic cialis 40mg cheap viagra order sildenafil 100mg sale
furosemide for sale online buy lasix 100mg hydroxychloroquine 400mg sale
sporanox 100 mg for sale buy generic itraconazole 100mg buy tindamax online cheap
purchase zyprexa for sale purchase zyprexa pill purchase diovan without prescription
order norvasc pill oral cialis 40mg tadalafil ca
generic sildenafil 100mg viagra 50mg generic lisinopril 5mg uk
prilosec cheap pay for research papers blackjack online money
cost metoprolol 100mg tenormin online order levitra oral
affordable term papers buy viagra 100mg for sale sildenafil 50mg price
order clomiphene pills order ventolin inhalator for sale online blackjack live dealer
aristocort 4mg cheap buy aristocort 4mg online desloratadine 5mg cost
dapoxetine brand priligy 90mg canada synthroid 100mcg uk
cialis 10mg us order sildenafil 100mg generic sildenafil for sale
buy orlistat 120mg pills orlistat 120mg pill cost acyclovir
order motilium 10mg without prescription cyclobenzaprine 15mg us brand flexeril 15mg
buy cozaar 25mg online cheap losartan 50mg generic topiramate 200mg tablet
imitrex 25mg cost levofloxacin for sale buy dutasteride without prescription
zantac generic mobic 15mg tablet order celebrex 200mg
tamsulosin 0.2mg canada order ondansetron online cheap brand spironolactone 25mg
order keflex 500mg without prescription erythromycin 500mg cheap order erythromycin online
order tadalafil 5mg generic oral tadalafil cheap sildenafil for sale
viagra us order generic sildenafil 100mg tadalafil cialis
my family essay writing buy stromectol generic buy ivermectin canada
zithromax canada brand prednisolone 10mg order generic neurontin 600mg
sildenafil 100mg generic buy generic rhinocort budesonide ca
tretinoin cream us tadalafil cheap brand avanafil 100mg
tadacip medication buy indomethacin 50mg online cheap order indocin generic
order lamisil 250mg online buy trimox 500mg sale buy amoxicillin 500mg pill
order altace 5mg pills order amaryl 4mg sale cheap etoricoxib 60mg
essays writing order sulfasalazine sale azulfidine usa
buy temovate without prescription brand temovate cordarone 100mg generic
lanoxin 250mg without prescription molnupiravir canada buy molnupiravir 200mg sale
cost alendronate 35mg buy ibuprofen for sale order motrin generic
cheap priligy 30mg motilium for sale online motilium price
buy indomethacin generic flomax cheap purchase cenforce sale
order doxycycline 100mg for sale medrol pills methylprednisolone 4mg without prescription
order tadacip 10mg without prescription purchase tadalafil for sale trimox 250mg pill
buy tricor without prescription buy fenofibrate pills viagra 150 mg
esomeprazole 20mg uk clarithromycin 250mg sale oral lasix
Thank you for content. Area rugs and online home decor store. Hello Administ . Metropol Halı Karaca Halı Öztekin ve Selçuklu Halı Cami Halısı ve Cami Halıları Türkiye’nin En Büyük Cami Halısı Fabrikasıyız…
buy minocycline 100mg pills cheap gabapentin pills buy hytrin sale
Thank you great posting about essential oil. Hello Administ . Metropol Halı Karaca Halı Öztekin ve Selçuklu Halı Cami Halısı ve Cami Halıları Türkiye’nin En Büyük Cami Halısı Fabrikasıyız…
order metformin generic order calan online order tamoxifen 20mg generic
buy modafinil 200mg sale promethazine 25mg price buy promethazine sale
clomid usa order generic clomiphene 50mg order prednisolone 5mg pill
isotretinoin 40mg pills buy ampicillin generic ampicillin pills
isotretinoin 10mg uk accutane over the counter zithromax 500mg usa
prednisolone 20mg cost buy prednisolone 10mg generic furosemide tablet
cost avodart buy xenical pill buy xenical 60mg for sale
buy vibra-tabs pill buy generic acyclovir buy acyclovir pills
order azathioprine 50mg for sale order generic azathioprine 50mg naproxen oral
cheap omnicef 300 mg omnicef 300mg generic buy protonix 40mg pill
zocor 10mg price sildenafil 50mg for sale sildenafil citrate 50 mg
order viagra pill discounted cialis online cialis 10mg cheap
buy uroxatral 10mg without prescription diltiazem buy online order diltiazem generic
promethazine 25mg us modafinil 200mg pills buy cialis 20mg without prescription
levaquin 250mg cheap order bupropion generic buy zyban 150 mg generic
buy warfarin 2mg online cheap allopurinol 300mg pill order zyloprim 100mg for sale
order cenforce oral aralen 250mg glucophage where to buy
stromectol how much it cost accutane 10mg cheap buy cheap isotretinoin
provigil without prescription buy deltasone 40mg online cheap brand prednisone 10mg
accutane 10mg ca order amoxil 1000mg generic order azithromycin 250mg online
purchase ventolin inhalator generic ventolin inhalator price oral synthroid 75mcg
prednisolone canada buy prednisolone 40mg pills order furosemide 40mg without prescription
canadian pharmacy online ship to usa
canadian pharmacy for sildenafil
synthroid 75mcg usa levitra online order buy generic vardenafil 10mg
biltricide pills buy periactin purchase cyproheptadine online
lisinopril 5mg oral buy generic metoprolol order metoprolol sale
sumycin pills cyclobenzaprine sale order baclofen 10mg online
tamsulosin cheap brand tamsulosin 0.4mg aldactone 100mg brand
duloxetine 20mg pills purchase duloxetine generic buy nootropil pills for sale
canadian online pharmacies ratings
on line pharmacy with no prescriptions
buy betnovate itraconazole 100mg us order sporanox for sale
best mail order pharmacies
canadian pharmacy worldwide
buy prometrium 100mg prometrium 200mg brand order olanzapine 10mg for sale
simvastatin 10mg price buy valacyclovir 1000mg sale cheap viagra for sale
order duricef sale proscar 5mg generic proscar pills
buy generic avanafil over the counter cheap avana 200mg order voltaren 50mg sale
buy clindamycin without a prescription cheap fildena 100mg buy generic fildena online
careprost over the counter how to buy careprost desyrel 100mg oral
buy minocin medication pioglitazone 30mg brand purchase actos pills
oral suhagra 100mg purchase sildenafil pills purchase sildalis for sale
leflunomide brand buy azulfidine pills for sale order azulfidine 500 mg online
order azipro 250mg generic order gabapentin 100mg generic order generic neurontin 800mg
ivermectin 4000 mcg buy generic deltasone 20mg deltasone ca
purchase furosemide pill generic ventolin 4mg buy generic albuterol online
purchase levitra generic plaquenil 200mg over the counter order hydroxychloroquine 200mg pills
order diamox 250mg generic generic isosorbide 20mg order generic azathioprine 50mg
purchase digoxin without prescription molnunat brand oral molnunat
naprosyn ca buy cefdinir for sale buy generic prevacid online
order montelukast for sale symmetrel 100 mg usa dapsone 100mg cheap
buy generic nifedipine online generic nifedipine 30mg allegra medication
purchase diltiazem generic buy acyclovir 800mg generic allopurinol usa
order aristocort 4mg pills claritin order claritin canada
buy rosuvastatin 20mg online buy rosuvastatin sale order motilium for sale
where to buy acillin without a prescription order metronidazole online purchase flagyl pills
buy toradol 10mg sale purchase colchicine sale purchase inderal generic
purchase bactrim generic order cleocin 300mg sale clindamycin for sale
buy erythromycin 500mg for sale sildenafil 100mg pills order nolvadex online cheap
buy rhinocort online cheap bimatoprost price bimatoprost us
topamax pills topiramate uk buy levofloxacin 500mg sale
buy avodart pills for sale buy zantac online cheap order meloxicam generic
sildenafil 100mg brand buy generic sildalis estradiol tablet
order celecoxib 200mg without prescription tamsulosin 0.4mg for sale oral ondansetron 4mg
buy finasteride generic viagra 100mg us sildenafil us
tretinoin for sale online retin cream tablet buy avana 200mg online
tadalafil 20mg for sale viagra for sale sildenafil 50mg for sale
purchase tadalafil online buy tadalafil 10mg buy ed pills cheap
lamisil pills suprax 100mg us buy amoxicillin 500mg generic
prescription drugs without doctor approval
cost movfor order generic omnicef 300mg purchase cefdinir
cheap dapsone 100mg brand perindopril 4mg oral aceon 8mg
buy cheap generic fexofenadine fexofenadine ca buy amaryl online
arcoxia 60mg drug astelin 10 ml tablet astelin 10 ml cheap
canadian pharmacy no rx needed
avapro without prescription irbesartan over the counter buspirone 10mg us
buy albenza 400mg pills provera for sale online order provera sale
order praziquantel 600 mg generic oral periactin purchase periactin online cheap
order luvox online order ketoconazole 200 mg cymbalta 20mg for sale
canadian pharma companies
buy anafranil without a prescription sporanox online order buy progesterone 100mg pills
tinidazole 500mg generic buy generic tindamax 500mg bystolic generic
buy dexamethasone 0,5 mg online starlix 120 mg uk nateglinide 120mg brand
buy cheap generic capoten buy tegretol without a prescription order carbamazepine generic
ciplox cheap buy duricef paypal buy cefadroxil 250mg pills
order frumil 5 mg for sale order clindamycin gel cost acyclovir
buy generic valcivir over the counter order famciclovir 500mg generic buy generic ofloxacin 200mg