Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中验证线程的成功状态?_Php_Multithreading - Fatal编程技术网

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

如何在PHP中验证线程的成功状态?,php,multithreading,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){

我有一个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个完整线程的数据,而没有成功地获取和解析数据


我的代码使用了一个扩展线程的类。

好的,我将尝试引导您朝着正确的方向前进

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

现在,这与你想要的正好相反。你想要的,如果我错了也请纠正我,是你想知道所有的线程是否都完成了,你不想为100个线程中的每一个阻塞,这使得所有的线程都是同步的

您可能想要的是某种事件系统。这意味着您的代码如下所示:

 fire up 100 threads
 do work in each thread
 when all 100 are done, consider the processing finished
如果我是你,我会创建100个线程+1个线程。这1个额外的线程将在线程完成工作后激发线程并收集它们的数据。那1,我们称之为
工作接收器
,将是您的主上下文所涉及的线程,一旦该线程完成,您的100个线程就完成了工作。现在,根据我有限的知识,你不能加入一个线程来检查它的状态。您可以与它同步,并检查成员的状态,该状态可以告诉您该成员是否仍在工作


至于如何编写所有这些代码,从我在官方git repo和php.net上看到的内容来看,有许多示例展示了如何与线程同步并检查其执行状态。您还可以在线程之间共享从
Threaded
派生的对象,这使得创建创建其他100个线程的工作接收器线程成为可能,或者它可以通过构造函数接受其他100个线程。这里有很多选项,从使用pthreads附带的线程池到编写自己的线程等等。

您必须检查线程的状态-例如,如果他们无法进行http获取,他们应该在某个地方记下。我使用“file\u get\u html”获取页面。有线索吗?file_get_html在成功时返回true还是false?@baldrs为什么要向下投票?线程始终是多线程处理的关键。我也有PHP的标题。我修改这个问题。你能投票吗?@Espanta什么是file\u get\u html?哪个库提供了它?-1表示不提供代码。你以前也问过类似的问题。您没有检查线程是否使用
join()
完成,而是与它同步并检查它是否正在运行()。感谢您的回复。然而,我想你们的回答是关于我之前关于完成的问题,正如你们提到的手工编码,我已经解决了这个问题。在这个阶段,我需要一些控制线程是成功完成还是失败并完成。当我们使用Ajax时,我知道jQuery中类似的完整/成功/失败概念。然而,我不知道这个概念是否符合这里。