无法发现PHP索引错误的问题可能是多线程问题

无法发现PHP索引错误的问题可能是多线程问题,php,Php,我正在努力找到以下PHP代码的问题: 代码如下 class WorkerThreads extends Thread { private $from_list; public function __construct($x,$host,$users_email,$pass,$inbox) { $this->from_list = array(); # holds the unique froms extracted from headers } public

我正在努力找到以下PHP代码的问题:

代码如下

class WorkerThreads extends Thread
{
  private $from_list;

  public function __construct($x,$host,$users_email,$pass,$inbox)
  {
    $this->from_list = array(); # holds the unique froms extracted from headers
  }

  public function run()
  {
    # Get Froms
    if (preg_match('/From\:\ (.+)/i', $headers, $matches, PREG_OFFSET_CAPTURE)) {
      $from = trim(str_ireplace("From: ", "", $matches[0][0]));
      if (!array_key_exists($from, $this->from_list)) {
        $this->from_list[$from] = 1;
        echo "<br/>FROM: ".$from."-".$this->from_list[$from]."<br/><br/>";
      }
    } else {
      echo "NO FROM <br/><rb/>";
    }
令人不快的第200行是

echo "<br/>FROM: ".$from."-".$this->from_list[$from]."<br/><br/>";

数组似乎有问题,如果不使用多线程,这将非常好地工作

我认为很多线程都在试图修改和读取相同的列表。尝试同步对from_列表的修改/读取。我们可以使用互斥锁来同步对from_列表的读/写

检查以下代码:

<?php
class WorkerThreads extends Thread
{
  private $from_list;
  private $mylock;

  public function __construct($x,$host,$users_email,$pass,$inbox)
  {
    $this->from_list = array(); # holds the unique froms extracted from headers
    $this->mylock = Mutex::create();
  }

  public function __destruct()
  {
    Mutex::destroy($this->mylock);
    $this->mylock = null;
  }

  public function run()
  {
    # Get Froms
    if (preg_match('/From\:\ (.+)/i', $headers, $matches, PREG_OFFSET_CAPTURE)) {
      $from = trim(str_ireplace("From: ", "", $matches[0][0]));
      Mutex::lock($this->mylock);
      if (!array_key_exists($from, $this->from_list)) {
        $this->from_list[$from] = 1;
        echo "<br/>FROM: ".$from."-".$this->from_list[$from]."<br/><br/>";
      }
      Mutex::unlock($this->mylock);
    } else {
      echo "NO FROM <br/><rb/>";
    }
  }
}

?>

找到行号198,检查哪个变量包含字符串Viva?这是第198行echo FROM:.$FROM.-.$This->FROM_list[$FROM]。;$from包含Viva-数组由于某种原因正在生成错误…因此$this->from\u list没有任何Viva键,那么在分配$this->from\u list[$from]之前,是否已将$this->from\u list初始化为数组?是-在前面的函数中-$this->from\u list=array;我该怎么做?我对线程tbh有点不清楚。@Del我已经更新了答案。您可以使用互斥来同步关键部分。或者您也可以使用synchronized block。我仍然会得到与结尾处相同的错误nipun注意:未定义属性:WorkerThreads::$mylock在第162行,其中第162行是Mutex::destroy$this->mylock;每个新类都有自己的一组私有变量-我不确定我们是否需要使用互斥,因为各个类都没有将varsAdd mylock作为私有变量共享。检查修改后的代码。你能把整个程序粘贴到某个地方吗?可能在ideone.com上?只有这样才能清楚错误在哪里。
<?php
class WorkerThreads extends Thread
{
  private $from_list;
  private $mylock;

  public function __construct($x,$host,$users_email,$pass,$inbox)
  {
    $this->from_list = array(); # holds the unique froms extracted from headers
    $this->mylock = Mutex::create();
  }

  public function __destruct()
  {
    Mutex::destroy($this->mylock);
    $this->mylock = null;
  }

  public function run()
  {
    # Get Froms
    if (preg_match('/From\:\ (.+)/i', $headers, $matches, PREG_OFFSET_CAPTURE)) {
      $from = trim(str_ireplace("From: ", "", $matches[0][0]));
      Mutex::lock($this->mylock);
      if (!array_key_exists($from, $this->from_list)) {
        $this->from_list[$from] = 1;
        echo "<br/>FROM: ".$from."-".$this->from_list[$from]."<br/><br/>";
      }
      Mutex::unlock($this->mylock);
    } else {
      echo "NO FROM <br/><rb/>";
    }
  }
}

?>