PHP.mk документација

curl_multi_select

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.curl-multi-select.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.curl-multi-select.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
curl_multi_select

Референца за `function.curl-multi-select.php` со подобрена типографија и навигација.

function.curl-multi-select.php

curl_multi_select

класата mysqli_driver

curl_multi_selectЧекај додека читањето или запишувањето не е можно за која било врска на cURL multi handle

= NULL

curl_multi_select(CurlMultiHandle $multi_handle, float $timeout = 1.0): int

Го блокира извршувањето на скриптата додека cURL рачката прикачена на cURL multi handle не би можела да направи напредок при следниот повик до curl_multi_exec() или додека не истече времето (кое и да настапи прво).

Параметри

multi_handle

cURL мулти рачка вратена од curl_multi_init().

timeout

Време, во секунди, за чекање одговор од активните cURL multi handle врски.

Вратени вредности

На успех, враќа број на активни дескриптори содржани во множествата на дескриптори. Ова може да биде 0 ако немаше активност на ниту еден од дескрипторите. На неуспех, оваа функција ќе врати -1 при неуспех на избор (од основниот select() системски повик).

Errors/Exceptions

Фрла ValueError if timeout е помала од 0 или поголемо од PHP_INT_MAX.

Дневник на промени

Верзија = NULL
8.4.0 Сега фрла ValueError if timeout е помала од 0 или поголемо од PHP_INT_MAX.
8.0.0 multi_handle беше вратено при неуспех. CurlMultiHandle инстанца сега; претходно, а resource се очекуваше.

Види Исто така

Белешки од корисници 5 белешки

nevil85 at gmail dot com
пред 11 години
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".
bishop на php точка net
пред 6 години
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
vigo dot von dot harrach at gmx dot de
пред 13 години
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.
јавно на grik dot net
пред 17 години
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.
xxavalanchexx at gmail dot com
пред 11 години
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 */
?>
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.