关于使用pthreads进行多线程处理的基本问题。
N个线程都以不同/相似/相同的时间写入同一个文件。如何使其安全?#39; ?即确保没有2个线程同时尝试写入。
class WebRequest extends Thread {
public $cik;
public function __construct($cik){
$this->cik = $cik;
}
public function run() {
for_cik($this->cik);
echo 'Running Thread : ' . $this->getCurrentThreadId() ."\n";
sleep(rand(1,3)) ;
}
function for_cik($cik) {
//doing work
// lock() ; ?
Log_NIK::getInstance()->write_line($log) ; //write this 'safely'
//unlock() ; ?
}
}
我搜索过,但发现只有语言特定的建议(对于其他语言.C#/ java等)
编辑:
write_line函数是:
function write_line($line){
file_put_contents($this->logFileName,$line."\n",FILE_APPEND) ;
}
答案 0 :(得分:4)
您没有显示所有代码。如果您在某处使用file_put_contents(),则会传递LOCK_EX标志。
file_put_contents('file.txt', 'content', LOCK_EX | FILE_APPEND);
答案 1 :(得分:-1)
在开始时搜索特定文件的现有内容。如果不存在 - 创建它然后最后丢弃它。如果另一个线程试图在其中写入,则无法执行此操作。
$fp = fopen(dirname(__FILE__) . DIRECTORY_SEPARATOR . "somefile.txt", "w+");
if (flock($fp, LOCK_EX | LOCK_NB)) {
// do your stuff here
flock($fp, LOCK_UN); // release the lock
unlink (dirname(__FILE__) . DIRECTORY_SEPARATOR . "somefile.txt");
}
fclose($fp);