从多个线程写入同一文件。同步?锁定? [Pthreads] [PHP]

时间:2015-05-27 08:32:30

标签: php multithreading

关于使用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) ;
    }

2 个答案:

答案 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);