跳转到主要内容

curl-multi-exec

curl_multi_exec

Processes each of the handles in the stack

ENTITY

int

curl_multi_exec

CurlMultiHandle

multi_handle

int

still_running

Processes each of the handles in the stack. This method can be called whether or not a handle needs to read or write data.

ENTITY

still_running
A reference to a flag to tell whether the operations are still running.

ENTITY

A cURL code defined in the cURL Predefined Constants.

This only returns errors regarding the whole multi stack. There might still have occurred problems on individual transfers even when this function returns CURLM_OK.

ENTITY

ENTITY ENTITY

ENTITY

curl_multi_exec example

This example will create curl handles for a list of URLs, add them to a multi handle, and process them asynchronously.

<?php

$urls = [
    "https://www.php.net/",
    "https://www.example.com/",
];

$mh = curl_multi_init();
$map = new WeakMap();

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $ch);
    $map[$ch] = $url;
}

do {
    $status = curl_multi_exec($mh, $unfinishedHandles);
    if ($status !== CURLM_OK) {
        throw new \Exception(curl_multi_strerror(curl_multi_errno($mh)));
    }

    while (($info = curl_multi_info_read($mh)) !== false) {
        if ($info['msg'] === CURLMSG_DONE) {
            $handle = $info['handle'];
            curl_multi_remove_handle($mh, $handle);
            $url = $map[$handle];

            if ($info['result'] === CURLE_OK) {
                $statusCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);

                echo "Request to {$url} finished with HTTP status {$statusCode}:", PHP_EOL;
                echo curl_multi_getcontent($handle);
                echo PHP_EOL, PHP_EOL;
            } else {
                echo "Request to {$url} failed with error: ", PHP_EOL;
                echo curl_strerror($info['result']);
                echo PHP_EOL, PHP_EOL;
            }
        }
    }

    if ($unfinishedHandles) {
        if (($updatedHandles = curl_multi_select($mh)) === -1) {
            throw new \Exception(curl_multi_strerror(curl_multi_errno($mh)));
        }
    }
} while ($unfinishedHandles);

curl_multi_close($mh);

?>

    

ENTITY

curl_multi_init, curl_multi_select, curl_exec