curl_multi_exec

Run the sub-connections of the current cURL handle

&reftitle.description; `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.

&reftitle.parameters;

&curl.mh.description;

`still_running`

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

&reftitle.returnvalues;

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`.

&reftitle.changelog;

&Version; | &Description;
&curl.changelog.multi-handle-param;

&reftitle.examples;

### `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);

    ?>

&reftitle.seealso;

- `curl_multi_init`
- `curl_multi_select`
- `curl_exec`