2011-07-29 3 views
2

Je pouvais seulement penser à curl_close() à partir de l'une des fonctions de rappel. mais php lève un avertissement:arrête un transfert curl au milieu

PHP Avertissement: curl_close(): Tentative de fermeture du handle cURL à partir d'un rappel.

des idées comment faire cela?

+0

Vous allez devoir poster plus de code. –

+0

pourriez-vous ajouter un peu plus d'informations s'il vous plaît, par exemple. ** pourquoi ** vous voulez fermer le transfert avant d'être terminé – wonk0

Répondre

0

Si le problème est que prend trop de temps pour exécuter la boucle, vous pouvez définir un temps, par exemple

<?php 
$c = curl_init('http://slow.example.com/'); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 15); 
$page = curl_exec($c); 
curl_close($c); 
echo $page; 
+0

non monsieur, j'utilise des algorithmes plus avancés que "prendre trop de temps à exécuter", et donc je dois le tuer quand mon algorithme le décide. – Mark

3

vous pouvez retourner faux ou quelque chose qui est pas la longueur des données actuellement téléchargées à partir de la fonction de rappel à abort curl

+0

+1, un peu plus de détails du manuel PHP pour curl_setopt: CURLOPT_WRITEFUNCTION Le nom d'une fonction de rappel où la fonction de rappel prend deux paramètres. La première est la ressource cURL et la seconde est une chaîne avec les données à écrire. Les données doivent être sauvegardées en utilisant cette fonction de rappel. Il doit retourner le nombre exact d'octets écrits ou le transfert sera annulé avec une erreur. –

0

J'ai eu un problème similaire qui nécessitait que je puisse arrêter un transfert de boucle au milieu. C'est facilement dans mon top dix personnel des «bidouilles sales qui semblent fonctionner» de tous les temps.

Créez une fonction de lecture curl qui sait quand il est temps d'annuler le téléchargement.

function curlReadFunction($ch, $fileHandle, $maxDataSize){ 

    if($GLOBALS['abortTransfer'] == TRUE){ 
     sleep(1); 
     return ""; 
    } 
    return fread($fileHandle, $maxDataSize); 
} 

Indiquez à Curl de s'arrêter si la vitesse de lecture des données chute trop lentement pendant un certain temps.

curl_setopt($ch, CURLOPT_READFUNCTION, 'curlReadFunction'); 
curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 1024); 
curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 5); 

Cela entraînera l'annulation du transfert de boucle pendant le téléchargement. Évidemment pas idéal mais ça semble marcher.