2017-02-18 8 views
1

Я пытаюсь найти способ остановить активную загрузку PHP Curl. Я загружаю большие файлы с удаленного сервера, и иногда я хотел бы отменить загрузку после ее запуска. Я попытался вернуть false в пределах CURLOPT_PROGRESSFUNCTION, однако это не сработало. Я также попытался удалить файл, который был загружен, и это тоже не сработало (статистика сети показывала, что загрузка продолжается).Остановить PHP Curl Скачать

Ниже код запускается с помощью быстрого вызова Ajax:

$ch = curl_init($file->url); 
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
 
curl_setopt($ch, CURLOPT_NOPROGRESS, false); 
 
curl_setopt($ch, CURLOPT_FILE, $targetFile); //save the file to here 
 
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function($resource, $download_size, $downloaded_size, $upload_size, $uploaded_size) use ($download_id) { 
 
    if ($download_size == 0) { 
 
     $progress = 0; 
 
    } else { 
 
     $progress = round($downloaded_size * 100/$download_size); 
 
    } 
 
    
 
    // if download complete trigger completed function 
 
    if($progress == 100) { 
 
    self::DownloadCompleted($download_id); 
 
    } 
 
\t \t \t \t 
 
}); 
 
$curl = curl_exec($ch);

+0

Дубликат http://stackoverflow.com/questions/6877930/stop-a-curl-transfer-in-the-middle :) –

+0

Похожие проблемы. Решение не было опубликовано. И это было с 6 лет назад .... – cantaffordretail

+0

Вы попробовали предложение о CURLOPT_WRITEFUNCTION ('Он должен вернуть точное количество записанных байт или передача будет прервана с ошибкой')? – Wizard

ответ

0

Решение было вернуть ненулевое значение в функции CURLOPT_PROGRESSFUNCTION, согласно drew010 в комментарии.

Для этого я добавил проверку внутри функции, чтобы увидеть, существует ли файл, если функция возвращает 1 и прерывается. Я просто создаю файл в каталоге с тем же именем, что и идентификатор загрузки, когда я хочу отменить загрузку. Это хорошо работает для меня.

$ch = curl_init($file->url); 
 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
 
curl_setopt($ch, CURLOPT_NOPROGRESS, false); 
 
curl_setopt($ch, CURLOPT_FILE, $targetFile); //save the file to here 
 
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function($resource, $download_size, $downloaded_size, $upload_size, $uploaded_size) use ($download_id) { 
 
    
 
    //if the file exists, the download is aborted 
 
    if(file_exists('path/to/directory/cancel.'.$download_id)) { 
 
    Self::CleanupCancelledDownload; //function to clean up the partially downloaded file, etc. 
 
    return 1; //returning a non-zero value cancels the CURL download. 
 
    } 
 
}); 
 
$curl = curl_exec($ch);

+0

Возможно, вы захотите добавить 'clearstatcache' в функцию обратного вызова, потому что результат' file_exists' может быть кэширован. – CBroe