如何在PHP中验证线程的成功状态?

时间:2014-11-18 15:52:32

标签: php multithreading

我有一个PHP代码,它同时调用大约100个线程,每个线程获取一个HTML页面并使用简单HTML DOM解析器解析它以获取某些信息。

这是代码

    //some code, including a loop to generate counter for thread
    $thread[$counter] = new fetch($link);
    $thread[$counter]->start();

    foreach($thread as $t){
        if($t->join()){
            //do something
        }//if
    }//foreach

以下是为每个线程执行的代码。

public function run(){
    $content = file_get_html("http:blahblabha");

    foreach($content->find('something') as $TL)
        $this->var = $TL->xmltext;
    }//run

但是,虽然我可以使用join()方法验证线程是否完整,但是在100个线程中,它会返回大约95个线程的数据和5个完整的线程,而不会成功获取和解析数据。

我的代码使用扩展Thread的类。

1 个答案:

答案 0 :(得分:1)

好的,我会试图引导你朝着正确的方向前进。

根据我对posix线程的了解,pthread_join()暂停调用上下文,直到引用的线程终止。一旦完成,分配给该线程的任何资源都将被释放 - 任何有更好理解的人,请在此纠正我。

现在,这与你想要的相反。你想要什么,如果我错了也纠正我,是你想要知道所有线程是否完成而且你不想阻止100中的每一个 - 这使得一切都是同步的。

您可能需要的是一种类型化的系统。这意味着您的代码如下所示:

 fire up 100 threads
 do work in each thread
 when all 100 are done, consider the processing finished

如果我是你,我会创造100个线程+ 1个。这1个额外的线程将激活线程并在完成工作后收集数据。那个1,我们称之为Work sink,将是你的主要上下文所说的线程,一旦完成该线程,你的100个线程就完成了工作。现在,根据我的有限知识,你不加入一个线程来检查它的状态。您可以与它同步并检查成员的状态,该状态可以告诉您它是否仍在工作。

至于如何来编码所有这些,从我在官方git repo和php.net上看到的 - 有很多例子展示了如何与线程同步并检查其执行状态。您还可以在线程之间共享从Threaded下降的对象,这样就可以创建Work Sink线程来创建另外100个线程,或者它可以通过构造函数接受其他100个线程。这里有很多选择,从使用pthreads附带的线程池到编写自己的线程池等。