2010-08-29 6 views
2

J'utilise curl_multi avec multi pour télécharger des fichiers sur différents serveurs. Chaque serveur a plusieurs fichiers à télécharger, j'ai donc une requête curl_multi pour chaque serveur. Lorsque j'exécute les poignées curl_multi, j'exécute simplement toutes les poignées curl_multi dans la même boucle, comme ceci:Combien de fois curl_multi_exec doit-il être appelé?

<?php 
do { 

$continue_running=false; 

foreach($handles as $host => $handle) { 

    if(!is_resource($handle[0])) { 
    die("\nHandle is not a resource!\n"); 
    } 

    if($running_{$host}) { 
    if(curl_multi_exec($handles[$host][0], $running_{$host}) != CURLM_OK) { 
    die("\ncurl_multi_exec failed!\n"); 
    } 
    $continue_running=true; 
    } 

    if(!$running_{$host} && !$done_{$host}) { 
    echo "$host finished in ".(microtime(1)-$start)." seconds\n"; 
    $done_{$host}=true; 
    } 
} 

} while ($continue_running); 
?> 

Ce que je me demande est, combien de fois curl_multi_exec ont en fait être appelé dans une requête boucle ? A-t-il besoin d'être appelé pour chaque petit peu de données transférées? C'est en utilisant beaucoup de cpu et je pense que c'est parce que son "looping" trop occupé. Donc je peux ajouter le sommeil (5); à la fin de chaque boucle pour lui faire utiliser moins de cycles de cpu, ou cela va-t-il ralentir les demandes majorly?

Je voudrais utiliser curl_multi_select, mais je ne peux pas car il y a plusieurs curl_multi_execs en cours de traitement.

Répondre

2

curl_multi_exec() lit et écrit des données sur le socket. Il s'arrête quand il ne peut pas écrire ou lire. Ainsi, le nombre d'appels nécessaires dépend de la quantité de données à transférer et de la vitesse du réseau. curl_multi_select() attend qu'une socket devienne lisible ou inscriptible.

Vous devez utiliser curl_multi_select() et avoir tous les hôtes dans un seul multi-handle. Vérifiez curl_getinfo() ou curl_multi_info_read() si vous voulez connaître la durée de chaque demande.

Questions connexes