PHP из CLI с использованием Curl Multi Exec - PullRequest
0 голосов
/ 03 декабря 2018

В приведенном ниже коде от http://php.net/manual/en/function.curl-multi-init.php

Как добавить код до того, как будет сделан второй запрос (т. Е. Sleep (5)) до того, как curl отправит запрос в твиттер)

С уважением

<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();

// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "https://www.google.com");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "https://twitter.com");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//create the multiple cURL handle
$mh = curl_multi_init();

//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
//execute the handles
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
    do {
        $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}

//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>

1 Ответ

0 голосов
/ 04 декабря 2018

Я не парень PHP или компетентный программист в этом отношении: D Теперь, когда отказ от ответственности есть, вот мое решение.

Вероятно, есть гораздо более чистый способ сделать это, но у меня ограниченные знания PHP и того, как расширять классы.По этой причине я решил использовать встроенные расширения управления процессом и создать вспомогательную функцию для управления процессом скручивания.Я уверен, что есть гораздо лучшие программисты, готовые предложить гораздо более чистое решение.

<?php

// Helper function
function async_curl($url,$delay){
    sleep($delay);
    echo "FORK: Getting $url after $delay seconds\n";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
    // Mute the return for demonstration purposes.
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}

$urls = array("http://google.com","http://twitter.com","http://www.facebook.com");

foreach($urls as $url){
    // Generate random timeout for demonstration purposes.
    $delay = rand(1,20);

    // Create a forked child process for each URL
    $pid = pcntl_fork();

    // Exit if fork failed
    if ($pid == -1) {
        exit("Error, failed to create a child process for the URL: $url");

    // Create a single child process to call the helper function
    } else if ($pid == 0) {
        echo "MAIN: Forking process for $url\nPID: " .getmypid() . "\tDelay: $delay\n";
        async_curl($url,$delay);
        exit();
    }
}

// Wait for all forked processes to complete before exiting.
while (($pid = pcntl_waitpid(0, $status)) > 0) { 
    echo "MAIN: Process $pid completed\n";
}
?>
...