如何使PHP多线程流而不是等待完成

时间:2011-06-28 17:28:53

标签: php multithreading curl fork piping

我正在使用以下CURL多线程向PHP进程添加多线程:

function multithread_it($url,$threads){
    $started=0;
    while ($started<$threads){
        $ch[$started] = curl_init();
        curl_setopt($ch[$started], CURLOPT_URL, $url);
        curl_setopt($ch[$started], CURLOPT_HEADER, 0);
        curl_setopt($ch[$started], CURLOPT_FOLLOWLOCATION, 0);
        curl_setopt($ch[$started], CURLOPT_RETURNTRANSFER, 0);
        $started++;
        }
    $started=0;
    $mh = curl_multi_init();
    while ($started<$threads){
        curl_multi_add_handle($mh,$ch[$started]);
        $started++;
        }
    $started=0;
    $running=null;
    do {curl_multi_exec($mh,$running);} while($running > 0);
    while ($started<$threads){
        curl_multi_remove_handle($mh, $ch[$started]);
        $started++;
        }
    curl_multi_close($mh);
    ob_flush();
    flush();
    }

这称为使用,例如

multithread_it($script_dir."script.php",10);

在script.php里面我有:

for($i=0;$i<10;$i++){
    echo $i."<br />";
    sleep(1);
    ob_flush();
    flush();
    }

但数据停滞不前。调用multithread_it的脚本会等到所有脚本都完成后再显示突然跳到屏幕上的数据。

这只是一个脚本的示例数据,实际上需要大约10分钟才能运行,但与flush,ob_flush和确切函数使用的概念和代码完全相同。

我有什么想法可以让script.php中的内容在加载时显示在父脚本中?

1 个答案:

答案 0 :(得分:0)

在下载多个网址时,Curl正在运行多个线程,但您的PHP代码仍然是单线程的,这意味着它将等待curl完成,然后才能对所有下载进行操作。

PHP最接近线程的是过程控制函数:http://www.php.net/manual/en/book.pcntl.php