无法发现PHP索引错误的问题可能是多线程问题
我正在努力找到以下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
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/>";
}
}
}
?>