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

从多个线程写入同一文件。同步?锁定?[Pthreads][PHP],php,multithreading,Php,Multithreading,关于使用pthreads的多线程的基本问题.. N在不同/相似/相同时间写入同一文件的线程数。。我如何使它“安全”?i、 e确保没有两个线程试图同时写入 class WebRequest extends Thread { public $cik; public function __construct($cik){ $this->cik = $cik; } public function run() {

关于使用pthreads的多线程的基本问题..
N在不同/相似/相同时间写入同一文件的线程数。。我如何使它“安全”?i、 e确保没有两个线程试图同时写入

  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() ; ?
      }
  }
我搜索了,但只找到了特定于语言的advice(适用于其他语言。C#/java等)

编辑:

写入线功能是:

    function write_line($line){

        file_put_contents($this->logFileName,$line."\n",FILE_APPEND) ;
    }

在开始时,搜索特定文件的现有文件。如果不存在-创建它,然后最终丢弃它。如果另一个线程试图在其中写入,它将无法这样做

$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);

在开始时,搜索特定文件的现有文件。如果不存在-创建它,然后最终丢弃它。如果另一个线程试图在其中写入,它将无法这样做

$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);

在开始时,搜索特定文件的现有文件。如果不存在-创建它,然后最终丢弃它。如果另一个线程试图在其中写入,它将无法这样做

$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);

在开始时,搜索特定文件的现有文件。如果不存在-创建它,然后最终丢弃它。如果另一个线程试图在其中写入,它将无法这样做

$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);

您不会显示所有代码。如果您使用的文件\u将\u contents()放在某个地方,则会传递LOCK\u EX标志

file_put_contents('file.txt', 'content', LOCK_EX | FILE_APPEND);

您不会显示所有代码。如果您使用的文件\u将\u contents()放在某个地方,则会传递LOCK\u EX标志

file_put_contents('file.txt', 'content', LOCK_EX | FILE_APPEND);

您不会显示所有代码。如果您使用的文件\u将\u contents()放在某个地方,则会传递LOCK\u EX标志

file_put_contents('file.txt', 'content', LOCK_EX | FILE_APPEND);

您不会显示所有代码。如果您使用的文件\u将\u contents()放在某个地方,则会传递LOCK\u EX标志

file_put_contents('file.txt', 'content', LOCK_EX | FILE_APPEND);

就这样?它所需要的只是LOCK_EX标志?它锁定文件,以便在完成之前其他任何人都无法访问它。其他线程将等待它解锁。就这样?它所需要的只是LOCK_EX标志?它锁定文件,以便在完成之前其他任何人都无法访问它。其他线程将等待它解锁。就这样?它所需要的只是LOCK_EX标志?它锁定文件,以便在完成之前其他任何人都无法访问它。其他线程将等待它解锁。就这样?它所需要的只是LOCK_EX标志?它锁定文件,以便在完成之前其他任何人都无法访问它。其他线程将等待解锁。可能是因为您没有显示所有代码。其中是:Log_NIK::getInstance()->write_line()的代码。这样我们就可以看到你是如何写这个文件的。。你不能只是扔掉一堆乱七八糟的代码,然后指望我们解决它。花点时间写一个好的问题,尽可能清楚,尽可能详细,这样我们就可以看到发生了什么。可能是因为您没有显示所有的代码。其中是:Log_NIK::getInstance()->write_line()的代码。这样我们就可以看到你是如何写这个文件的。。你不能只是扔掉一堆乱七八糟的代码,然后指望我们解决它。花点时间写一个好的问题,尽可能清楚,尽可能详细,这样我们就可以看到发生了什么。可能是因为您没有显示所有的代码。其中是:Log_NIK::getInstance()->write_line()的代码。这样我们就可以看到你是如何写这个文件的。。你不能只是扔掉一堆乱七八糟的代码,然后指望我们解决它。花点时间写一个好的问题,尽可能清楚,尽可能详细,这样我们就可以看到发生了什么。可能是因为您没有显示所有的代码。其中是:Log_NIK::getInstance()->write_line()的代码。这样我们就可以看到你是如何写这个文件的。。你不能只是扔掉一堆乱七八糟的代码,然后指望我们解决它。花点时间写一个好问题,尽可能清楚,尽可能详细,这样我们就可以看到发生了什么。。