php怎么解决多进程同时写一个文件的问题?-PHP问题

资源魔 86 0

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使用问题

抱歉,评论功能暂时关闭!