2015-05-04 100 views
1

我正在监视器上处理由大量计算机组成的结构。我在PHP中开发它,我想以最快的方式ping所有结构。 为此,我使用来自并行线程enter link description here继承了多线程所以我按照一些教程,最后我有一个类(从线程扩展),并在其他脚本调用者:PHP无法在线程运行上下文中打开文件

类:

class Ping extends Thread{ 
     public $id; 
     public $name; 
    public function __construct($id, $name){ 
     $this->id = $id; 
     $this->name = $name; 
    } 
    public function run(){ 
     $ping = exec("ping -n 1 -w 80 " . $this->name); 
     $h = fopen("ping.json", 'w'); 
     if(preg_match("#perte 100#", $ping)){    
      fwrite($h,'d'); 
     } 
     else { 
      fwrite($h,'c');   
     } 
     fclose($h); 
    } 
} 

来电者:

$p = array(); 
foreach($array_computer as $comp){   
     array_push($p, new Ping(array_search ($comp , $array_computer), $comp->{'name'})); 
    }  
    foreach ($p as $p_t){ 
     $p_t->start(PTHREADS_INHERIT_ALL); 
    } 

所以,我有两个问题:

1。当我要echo $ id或$ name时,什么都不显示

2。我无法打开“ping.json”,因为:“未能打开流:权限被拒绝”

如果我更换

$p_t->start(PTHREADS_INHERIT_ALL); 

通过

$p_t->run(); 

呼叫的作品,但我失去了多线程的兴趣:P

回答

0

难道是变种$p_t这是一个Ping的实例吗?

foreach ($p as $p_t) 

也尝试检查实例ie。

if ($p_t instanceof Ping) { 
    $p_t->start(); 
} 
+0

这不是问题,我已经尝试过了。我试图把文件句柄放在Ping类的参数中,但我遇到同样的问题,除了当我尝试使用一个Ping对象时。 –

+0

我会第二@C。 van Dorsten评论如上。自适应验证和调试,自上而下。 [http://php.net/manual/en/class.thread.php]有一些例子。 – daxeh

0

一些问题/备注,以帮助你前进:

  1. 你正在写东西,根据计算机名文件,但 此名称的价值呢?否则,输出文件将为空,并且您将不会得到结果。
  2. 在这个foreach中,echo你想存储在$ p中的参数,所以你知道你正在把东西放在那里。
  3. 启动方法从哪里来? $ p是对象数组 的对象吗?是的,该方法在哪里宣布?
  4. $ comp - > {'name'}对我来说很古怪;如果它是一个数组,如果它是一个 对象或$ comp ['name'],为什么不使用$ comp-> name?
  5. 你没有在公共变量中存储任何结果值;因此 当输入值为空时,它将保持空白。
0

感谢您的回答, 我发现了另一种解决方法,将数据结果存储到数据库中,放入run()函数中。 我认为当我想同时写入json文件时出现了一些冲突,并且使用flock()锁定文件效率不高。

我把平安类,并在同一个文件的调用者和统筹线程excution这样的:

$i = 0; 
    foreach ($p as $p_t){ 
     while($i > 15){}    
     $i++; 
     $p_t->start(); 
     if($p_t->join())$i--; 
    }