Home > Article > Backend Development > How to solve the problem of multiple processes writing a file at the same time in PHP?
php method to solve the problem of multiple processes writing a file at the same time: first copy the file that needs to be updated and change the file name; then check whether the last update time is consistent with the previously saved time; finally, modify the temporary file Rename to original file.
php method to solve the problem of multiple processes writing a file at the same time:
First of all, PHP supports processes but does not support multi-threading (clarify this first). If it is a file operation, in fact, you only need to lock the file to solve the problem. No other operations are required. PHP flock has done it for you.
Use flock to lock the file before writing, and unlock it after writing. This allows multiple threads to read and write a file at the same time to avoid conflicts. It’s probably the following process
/* *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); )
Related learning recommendations: PHP programming from entry to proficiency
Solution: Do not use flock function, Use temporary files to resolve read and write conflicts.
The general principle is as follows:
(1) Put a copy of the file that needs to be updated into our temporary file directory, save the last modification time of the file to a variable, and set this The temporary file takes a random, unlikely to be repeated file name.
(2) After updating this temporary file, check whether the last update time of the original file is consistent with the previously saved time.
(3) If the last modification time is the same, rename the modified temporary file to the original file. In order to ensure that the file status is updated synchronously, the file status needs to be cleared.
(4) However, if the last modification time is consistent with the previously saved one, it means that the original file has been modified during this period. At this time, the temporary file needs to be deleted, and then return false, indicating The file is currently being operated by other processes.
The implementation code is as follows:
The code is as follows:
$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');
For the functions used in the above code, it is necessary to explain:
(1)rename();
Rename a file or a directory. This function is actually more like mv in Linux. It is convenient to update the path or name of a file or directory. But when I test the above code in window, if the new file name already exists, a notice will be given saying that the current file already exists. But it works fine under linux.
(2)clearstatcache();
Clear the status of the file.php will cache all file attribute information to provide higher performance, but sometimes, multiple processes are deleting the file or During the update operation, PHP does not have time to update the file attributes in the cache, which can easily lead to the fact that the last update time accessed is not real data. So here you need to use this function to clear the saved cache.
The above is the detailed content of How to solve the problem of multiple processes writing a file at the same time in PHP?. For more information, please follow other related articles on the PHP Chinese website!