curl_multi_select

(PHP 5)

curl_multi_select — Возвращает сокеты, созданные модулем cURL

Описание

int curl_multi_select ( resource $mh [, float $timeout ] )
Внимание

К настоящему времени эта функция еще не была документирована; для ознакомления доступен только список аргументов.

См. также описание функции curl_multi_init().

Коментарии

This function blocks the calling process until there is activity on any of the connections opened by the curl_multi interface, or until the timeout period has expired. 
In other words, it waits for data to be received in the opened connections.

Internally it fetches socket pointers with "curl_multi_fdset()" and runs the "select()" C function.
It returns in 3 cases:
1. Activity is detected on any socket;
2. Timeout has ended (second parameter);
3. Process received any signal (#man kill).

The function returns an integer:
* In case of activity it returns a number, usually 1.
I suppose, it returns the number of connections with activity detected.
* If timeout expires it returns 0
* In case of error it returns -1

Thanks for attention, hope this helps.
2008-08-10 09:38:10
http://php5.kiev.ua/manual/ru/function.curl-multi-select.html
curl_multi_select($mh, $timeout) simply blocks for $timeout seconds while curl_multi_exec() returns CURLM_CALL_MULTI_PERFORM. Otherwise, it works as intended, and blocks until at least one connection has completed or $timeout seconds, whatever happens first.

For that reason, curl_multi_exec() should always be wrapped:

<?php
 
function full_curl_multi_exec($mh, &$still_running) {
    do {
     
$rv curl_multi_exec($mh$still_running);
    } while (
$rv == CURLM_CALL_MULTI_PERFORM);
    return 
$rv;
  }
?>

With that, the core of "multi" processing becomes (ignoring error handling for brevity):

<?php
  full_curl_multi_exec
($mh$still_running); // start requests
 
do { // "wait for completion"-loop
   
curl_multi_select($mh); // non-busy (!) wait for state change
   
full_curl_multi_exec($mh$still_running); // get new state
   
while ($info curl_multi_info_read($mh)) {
     
// process completed request (e.g. curl_multi_getcontent($info['handle']))
   
}
  } while (
$still_running);
?>

Note that after starting requests, retrieval is done in the background - one of the better shots at parallel processing in PHP.
2012-06-06 13:53:29
http://php5.kiev.ua/manual/ru/function.curl-multi-select.html
According to https://bugs.php.net/bug.php?id=61141:

On Windows setups using libcurl version 7.24 or later (which seems to correspond to PHP 5.3.10 or later), you may find that this always returns -1. This is, apparently, not strictly a bug: according to the libcurl documentation, you should add your own sleep if curl_multi_select returns -1.

For example:
<?php
/* setup $mh */

$active null;
do {
   
$mrc curl_multi_exec($mh$active);
} while (
$mrc == CURLM_CALL_MULTI_PERFORM);

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

/* close $mh */
?>
2014-05-20 03:13:03
http://php5.kiev.ua/manual/ru/function.curl-multi-select.html
Even after so many distro releases, in PHP v5.5.9 and libcurl v7.35.0, curl_multi_select still returns -1. The only work around here is to wait and proceed like nothing ever happened. You have to determine the "wait" required here. 

In my application a very small interval like usleep(1) worked. For example:

<?php
       
// While we're still active, execute curl
       
$active null;
        do {
           
$mrc curl_multi_exec($multi$active);
        } while (
$mrc == CURLM_CALL_MULTI_PERFORM);
   
        while (
$active && $mrc == CURLM_OK) {
           
// Wait for activity on any curl-connection
           
if (curl_multi_select($multi) == -1) {
               
usleep(1);
            }
   
           
// Continue to exec until curl is ready to
            // give us more data
           
do {
               
$mrc curl_multi_exec($multi$active);
            } while (
$mrc == CURLM_CALL_MULTI_PERFORM);
        }
?>

Internally php curl_multi_select uses libcurl curl_multi_fdset function and its libcurl documentation says :
http://curl.haxx.se/libcurl/c/curl_multi_fdset.html

"When libcurl returns -1 in max_fd, it is because libcurl currently does something that isn't possible for your application to monitor with a socket and unfortunately you can then not know exactly when the current action is completed using select(). When max_fd returns with -1, you need to wait a while and then proceed and call curl_multi_perform anyway. How long to wait? I would suggest 100 milliseconds at least, but you may want to test it out in your own particular conditions to find a suitable value. 

When doing select(), you should use curl_multi_timeout to figure out how long to wait for action."

Untill PHP implements curl_multi_timeout() we have to play with our application and determine the "wait".
2014-07-15 19:06:13
http://php5.kiev.ua/manual/ru/function.curl-multi-select.html
Before PHP 7.1.23 and 7.2.11, curl_multi_select() would return -1 if cURL had no open file descriptors. Since then, assuming libcurl 7.28 or higher, curl_multi_select() will return 0 if cURL has no open file descriptors and -1 on error.

See https://bugs.php.net/bug.php?id=76480

This is a BC break. See https://bugs.php.net/bug.php?id=77030
2019-05-22 04:50:31
http://php5.kiev.ua/manual/ru/function.curl-multi-select.html

    Поддержать сайт на родительском проекте КГБ