2015-06-10 73 views
0

我在努力尋找與下面的一段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 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/>"; 
    } 

以下發生錯誤:

Notice: Undefined index: Viva in /var/www/BAMCode/yahoofroms.php on line 198  
FROM: Viva- 

有問題的行200是

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

似乎有一個陣列的問題

+0

於是找到行號198和檢查哪些變量包含字符串'Viva'? – adeneo

+0

這是行198 echo「
FROM:」。$ from。「 - 」。$ this-> from_list [$ from]。「

」; $ from包含Viva - 數組出於某種原因正在生成錯誤... – Del

+0

因此'$ this-> from_list'沒有任何關鍵字'Viva'然後 – adeneo

回答

-1

如果你不使用多線程,這將工作得很好。

我想很多線程都試圖修改和讀取相同的列表。嘗試同步修改/讀取from_list。我們可以使用一個互斥鎖來同步讀/寫from_list。

檢查下面的代碼:

<?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/>"; 
    } 
    } 
} 

?> 
+0

我該怎麼做?我有點不清楚線程tbh。 – Del

+0

@我已經更新了答案。您可以使用互斥鎖來同步關鍵部分。或者你也可以使用synchronized塊。 –

+0

我仍然得到相同的錯誤nipun,因爲這在最後「注意:未定義的屬性:WorkerThreads :: $ mylock 162行」,其中line162是Mutex :: destroy($ this-> mylock); – Del