Autor Zpráva
Multithread
Profil *
Ahoj, dělám na skriptu který stahuju soubory z webu. Z důvodu pomalého připojení chci udělat stahování vícevláknové. Koukal jsem na pár kodu(viz http://www.newsroom.cz/php-javascript/55-php-skripty/64-php-multithreading-s-knihovnou-curl, http://php.vrana.cz/paralelni-zpracovani.php) a měřil si jak dlouho probíhají. "Nevláknový" skript probíhal mnohem kratší dobu. Jak je to možné?

Porovnávám čas těchto kodů:

Vícevkláknový
<?php
$vyhledavace = array( // nazev => array(url, pattern), ...
    'Seznam.cz' => array('http://search.seznam.cz/', '<b>([ 0-9]+)</b> nalezen'),
    'Centrum.cz' => array('http://search.centrum.cz/', 'Nalezeno <strong>([ 0-9]+)</strong>'),
    'Atlas.cz' => array('http://search.atlas.cz/', '<b>([ 0-9]+)</b></span> nalezen'),
    'Jyxo.cz' => array('http://jyxo.cz/', 'Jyxo nalezlo <b>([0-9]+)</b>'),
    'Google.com' => array('http://www.google.com/', 'of about <b>([,0-9]+)</b>'),
    'polymed.cz' => array('http://www.polymed.cz', 'of about <b>([,0-9]+)</b>'),
);
//    'Seznam.cz' => array('http://search.seznam.cz/search.cgi?w=', '<b>([ 0-9]+)</b> nalezen'),
//    'Centrum.cz' => array('http://search.centrum.cz/index.php?q=', 'Nalezeno <strong>([ 0-9]+)</strong>'),
//    'Atlas.cz' => array('http://search.atlas.cz/default.aspx?q=', '<b>([ 0-9]+)</b></span> nalezen'),
//    'Jyxo.cz' => array('http://jyxo.cz/s?s=', 'Jyxo nalezlo <b>([0-9]+)</b>'),
//    'Google.com' => array('http://www.google.com/search?q=', 'of about <b>([,0-9]+)</b>'),
//    'polymed.cz' => array('http://www.polymed.cz', 'of about <b>([,0-9]+)</b>'),
//);
$curl_multi = curl_multi_init();
foreach ($vyhledavace as &$val) {
    $val[2] = curl_init($val[0] . urlencode($_GET["slovo"]));
    curl_setopt($val[2], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($curl_multi, $val[2]);
}
unset($val);
do {
    curl_multi_select($curl_multi);
    while (CURLM_CALL_MULTI_PERFORM == curl_multi_exec($curl_multi, $running)) {
        // provést znovu
    }
    if ($running && strtoupper(substr(PHP_OS, 0, 3)) == "WIN") {
        sleep(1); // pod Windows curl_multi_select() nečeká
    }
} while ($running);
foreach ($vyhledavace as $nazev => $val) {
    $file = curl_multi_getcontent($val[2]);
    echo $file;
//    echo "$nazev: " . (preg_match("~$val[1]~", $file, $matches) ? $matches[1] : "nenalezeno") . "\n";
}
?>



<?php
$vyhledavace = array( // nazev => array(url, pattern), ...
    'Seznam.cz' => array('http://search.seznam.cz/', '<b>([ 0-9]+)</b> nalezen'),
    'Centrum.cz' => array('http://search.centrum.cz/', 'Nalezeno <strong>([ 0-9]+)</strong>'),
    'Atlas.cz' => array('http://search.atlas.cz/', '<b>([ 0-9]+)</b></span> nalezen'),
    'Jyxo.cz' => array('http://jyxo.cz/', 'Jyxo nalezlo <b>([0-9]+)</b>'),
    'Google.com' => array('http://www.google.com/', 'of about <b>([,0-9]+)</b>'),
    'polymed.cz' => array('http://www.polymed.cz', 'of about <b>([,0-9]+)</b>'),
);

foreach ($vyhledavace as $val) {
//    print_r($val);
    $file = file_get_contents($val[0]);
    //echo $file;
//    echo "$nazev: " . (preg_match("~$val[1]~", $file, $matches) ? $matches[1] : "nenalezeno") . "\n";
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: