php处理多过程同时写一个文件的办法:起首复制需求更新的文件,并更改文件名;而后反省最初更新工夫以及先前所保留的工夫能否分歧;最初将所修正的暂时文件重定名到原文件。
php处理多过程同时写一个文件的办法:
起首PHP是支持过程的而没有支持多线程(这个先搞分明了),假如是关于文件操作,其实你只要要给文件加锁就能处理,没有需求其它操作,PHP的flock曾经帮你搞定了。
用flock正在写文件前先锁上,等写完后解锁,这样就完成了多线程同时读写一个文件防止抵触。大略就是上面这个流程
/* *flock(file,lock,block) *file 必须,规则要锁定或开释的已关上的文件 *lock 必须。规则要应用哪一种锁定类型。 *block 可选。若设置为 1 或 true,则当进行锁按时拦阻其余过程。 *lock *LOCK_SH 要获得同享锁定(读取的顺序) *LOCK_EX 要获得独有锁定(写入的顺序) *LOCK_UN 要开释锁定(无论同享或独有) *LOCK_NB 假如没有心愿 flock() 正在锁按时梗塞 /* if (flock($file,LOCK_EX)) { fwrite($file,'write more words'); flock($file,LOCK_UN); } else { //解决谬误逻辑 } fclose($file); )
相干学习保举:PHP编程从入门到通晓
计划:没有应用flock函数,借用暂时文件来处理读写抵触的成绩。
大抵原理以下:
(1)将需求更新的文件思考一份到咱们的暂时文件目次,将文件最初修正工夫保留到一个变量,并为这个暂时文件取一个随机的,不易反复的文件名。
(2)当对这个暂时文件进行更新后,再检测原文件的最初更新工夫以及先前所保留的工夫能否分歧。
(3)假如最初一次修正工夫分歧,就将所修正的暂时文件重定名到原文件,为了确保文件状态同步更新,以是需求肃清一下文件状态。
(4)然而,假如最初一次修正工夫以及先前所保留的分歧,这阐明正在这时期,原文件曾经被修正过,这时候,需求把暂时文件删除了,而后前往false,阐明文件这时候有其它过程正在进行操作。
完成代码以下:
代码以下:
$dir_fileopen='tmp'; function randomid(){ return time().substr(md5(microtime()),0,rand(5,12)); } function cfopen($filename,$mode){ global $dir_fileopen; clearstatcache(); do{ $id=md5(randomid(rand(),TRUE)); $tempfilename=$dir_fileopen.'/'.$id.md5($filename); } while(file_exists($tempfilename)); if(file_exists($filename)){ $newfile=false; copy($filename,$tempfilename); }else{ $newfile=true; } $fp=fopen($tempfilename,$mode); return $fp?array($fp,$filename,$id,@filemtime($filename)):false; } function cfwrite($fp,$string){ return fwrite($fp[0],$string); } function cfclose($fp,$debug='off'){ global $dir_fileopen; $success=fclose($fp[0]); clearstatcache(); $tempfilename=$dir_fileopen.'/'.$fp[2].md5($fp[1]); if((@filemtime($fp[1])==$fp[3])||($fp[4]==true&&!file_exists($fp[1]))||$fp[5]==true){ rename($tempfilename,$fp[1]); }else{ unlink($tempfilename); //阐明有其它过程 正在操作指标文件,以后过程被回绝 $success=false; } return $success; } $fp=cfopen('lock.txt','a+'); cfwrite($fp,"welcome to beijing.\n"); fclose($fp,'on');
关于下面的代码所应用的函数,需求阐明一下:
(1)rename();
重定名一个文件或一个目次,该函数其实更像linux里的mv。更新文件或许目次的门路或名字很不便。但当我正在window测试下面代码时,假如新文件名曾经存正在,会给出一个notice,说以后文件曾经存正在。但正在linux下工作的很好。
(2)clearstatcache();
肃清文件的状态.php将缓存一切文件属性信息,以提供更高的功能,但有时,多过程正在对文件进行删除了或许更新操作时,php没来患上及更新缓存里的文件属性,容易招致拜访到最初更新工夫没有是实在的数据。以是这里需求应用该函数对已保留的缓存进行肃清。
以上就是php怎样处理多过程同时写一个文件的成绩?的具体内容,更多请存眷资源魔其它相干文章!
标签: php 文件 php教程 多进程 php故障解决 php使用问题
抱歉,评论功能暂时关闭!