2015-03-26 7 views
0

Я работал над этим и не мог найти способ полностью его понять.Как работает cURL Keep-alive?

У меня есть этот код:

<?php 
function get2($url) { 
    // Create a handle. 
    $handle = curl_init($url); 

    // Set options... 

    // Do the request. 
    $ret = curlExecWithMulti($handle); 

    // Do stuff with the results... 

    // Destroy the handle. 
    curl_close($handle); 

} 

function curlExecWithMulti($handle) { 
    // In real life this is a class variable. 
    static $multi = NULL; 

    // Create a multi if necessary. 
    if (empty($multi)) { 
    $multi = curl_multi_init(); 
    } 

    // Add the handle to be processed. 
    curl_multi_add_handle($multi, $handle); 

    // Do all the processing. 
    $active = NULL; 
    do { 
    $ret = curl_multi_exec($multi, $active); 
    } while ($ret == CURLM_CALL_MULTI_PERFORM); 

    while ($active && $ret == CURLM_OK) { 
    if (curl_multi_select($multi) != -1) { 
     do { 
     $mrc = curl_multi_exec($multi, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
    } 

    // Remove the handle from the multi processor. 
    curl_multi_remove_handle($multi, $handle); 

    return TRUE; 
} 

?> 

Данный скрипт делает это: я бегу PHP, и это создает новое соединение TCP, он возвращает данные, а затем закрывает соединение.

Сервер работает с HTTP 1.1 и соединением: keep-alive.

Что я хочу, если я запустил сценарий, создаст соединение, вернет данные и НЕ закроет соединение, а когда я запустим скрипт PHP, то будет использовать это же соединение (конечно, если это соединение не истечет после таймаута от севера).

Возможно ли это с cURL? Я понимаю multi в cURL неправильно?

ответ

1

Когда программа выходит, все ее открытые сокеты (действительно, все открытые файлы) закрыты. Невозможно повторно использовать соединение из одного экземпляра в другой (*). Вы должны повторно открыть новое соединение или цикл в своем приложении.

Если вы хотите использовать HTTP Keep-Alive, ваша программа не должна выйти.

(*) Есть способы держать сокет открытым внутри одного процесса и передавать его другим через сокеты домена Unix, но это расширенная тема, которую я рекомендую; Я упоминаю это только для полноты.

Смежные вопросы