curl_multi_exec

Run the sub-connections of the current cURL handle

&reftitle.description; `int` `curl_multi_exec` `resource` `mh` `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.examples;

### `curl_multi_exec` example

This example will create two cURL handles, add them to a multi handle, and then run them in parallel.

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

    // set URL and other appropriate options
    curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
    curl_setopt($ch1, CURLOPT_HEADER, 0);
    curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
    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);

    ?>

&reftitle.seealso;

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