Как сделать PHP многопоточным потоком вместо ожидания завершения - PullRequest
0 голосов
/ 28 июня 2011

Я использую следующую многопоточность 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 голосов
/ 28 июня 2011

Curl работает с несколькими потоками при загрузке нескольких URL-адресов, но ваш php-код все еще однопоточный, что означает, что он будет ждать окончания curl, прежде чем вы сможете выполнить все загрузки.

Ближайшее, что есть в PHP, - это функции управления процессом .: http://www.php.net/manual/en/book.pcntl.php

...