2010-03-26 5 views
0

J'utilise url pour demander des URL distantes qui peuvent parfois être très lentes ou juste en baisse. Dans ce cas, mes scripts php attendent toujours la réponse, cela fait que apache a de nombreuses requêtes restent en mémoire puis surchargent. J'ai besoin d'un moyen d'arrêter curl demandant ou arrêter l'exécution de script PHP lorsque le temps spécifié passé. J'avais essayé declare(), cela n'a aucun sens pour curl. Quelqu'un peut-il savoir comment le résoudre?Comment arrêter une boucle tout en demandant ou arrêter le script PHP en cours d'exécution?

BTW: quel est l'effet de CURLOPT_CONNECTTIMEOUT et CURLOPT_TIMEOUT?

exemple de code est ici:

function http($url, $method, $postfields = NULL) { 
    $ci = curl_init(); 
    /* Curl settings */ 
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($ci, CURLOPT_TIMEOUT, 5); 
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:')); 
    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, 0); 

    switch ($method) { 
    case 'POST': 
     curl_setopt($ci, CURLOPT_POST, TRUE); 
     if (!empty($postfields)) { 
      curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); 
     } 
     break; 
    case 'DELETE': 
     curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); 
     if (!empty($postfields)) { 
      $url = "{$url}?{$postfields}"; 
     } 
    } 

    curl_setopt($ci, CURLOPT_URL, $url); 
    $response = curl_exec($ci); 
    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); 
    $this->last_api_call = $url; 
    curl_close ($ci); 
    return $response; 
} 

Je mis le connecttimeout et le délai de 5 secondes, mais il ne marche pas workd. Curl passent encore beaucoup de temps pour terminer la requête, mais l'url sinon la réponse en 5s, ce qui signifie qu'il est en panne ou que la condition réseau est mauvaise, devrait l'arrêter.

+1

La définition d'un délai est la solution courante. Quel est le problème avec 'CURLOPT_TIMEOUT'? Vous voudrez peut-être ajouter du code et une description de ce qui ne fonctionne pas si vous voulez de l'aide pour cela. –

Répondre

1

CURLOPT_CONNECTTIMEOUT arrêtera la demande si la connexion n'a pas encore été établie après le délai spécifié

CURLOPT_TIMEOUT arrêtera la demande si la réponse complète n'a pas encore été reçue après le délai spécifié

Pour moi, je parfois je vous avez des problèmes où cela ne se termine toujours pas, dans ce cas vous pouvez essayer quelque chose comme ceci:

declare(ticks = 1); 

function sig_handler($sig) { 

mysql_query("insert into log (event) values ('Timed out!')"); 
die("Timed out!"); 

} 

pcntl_signal(SIGALRM,"sig_handler"); 
// call sig_handler function after 30 seconds 
pcntl_alarm(30); 

// curl code here 
+0

Je ne peux pas tester avec pcntl, le serveur ne le supporte pas. Merci tout de même. – Chris

Questions connexes