PHP无法在线程运行上下文中打开文件

时间:2015-05-04 13:43:03

标签: php multithreading pthreads

我'我在显示器上工作,由许多计算机组成的结构。我用PHP开发它,我希望以最快的方式ping所有结构。 为此,我使用从pthread继承的多线程enter link description here所以我遵循一些教程,最后我有一个类(从Thread扩展)和一个调用者在另一个脚本中:

班级:

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。当我想回显$ id或$ name时,什么都不显示

2。我无法打开ping.json'因为:"无法打开流:权限被拒绝"

如果我替换

$p_t->start(PTHREADS_INHERIT_ALL);

通过

$p_t->run();

通话有效,但我失去了多线程的兴趣:P

3 个答案:

答案 0 :(得分:0)

可能是var $p_t,它是Ping的一个实例吗?

foreach ($p as $p_t)

也尝试检查例如ie。

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

答案 1 :(得分:0)

一些问题/评论可以帮助您:

  1. 您正在基于计算机名称向文件写入内容,但有 这个名字有价值吗?否则输出文件将为空并且您 不会得到结果。
  2. 在foreach中,回显您想要存储在$ p中的参数 你知道你在那里放东西。
  3. start方法来自哪里? $ p是一个对象数组 宾语?是这样,方法在哪里宣布?
  4. $ comp-> {'name'}对我来说很奇怪;为什么不使用$ comp->名称,如果它是 object或$ comp ['name']如果它是一个数组?
  5. 您没有在公共变量中存储任何结果值;因此 当输入值为空时,它将保持空白。

答案 2 :(得分:0)

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

我将Ping类和调用者放在同一个文件中,并按如下方式执行线程执行:

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