我正在尝试用PHP取消已经启动的cURL请求。由于我一直在努力寻找一个好的解决方案,因此我现在仍然停留在取消链接功能上,该功能实际上并不起作用,因为cURL正在下载内容。
unlink(/foobar/foo.txt): Resource temporarily unavailable in /project/delete.php on line 16
此代码是我现在遇到的问题:
unlink($fileLocation);
由于我没有使用cURL的经验,所以我不确定如何设法停止在下载部分完成的cURL请求:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_exec($ch);
用例主要是什么:用户下载文件,并且还应该可以取消下载。我该如何做到呢?
答案 0 :(得分:1)
假设您正在将下载脚本作为守护程序运行,则可以使用CURLOPT_PROGRESSFUNCTION
选项:(否则,您可以通过离开页面来中止请求或中止xhr)
如文档中所述:
返回非零值以中止传输。在这种情况下, 传输将设置CURLE_ABORTED_BY_CALLBACK错误。
因此您可以使用一个回调函数,该函数将不断检查数据库值是否设置为true,如果是,则返回1,这将中止卷曲。
然后,当用户单击“取消”按钮时,您应该更新数据库并将该值设置为true。
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_exec($ch);
if (curl_errno($ch) === CURLE_ABORTED_BY_CALLBACK) {
// Callback aborted
}
function shouldAbortDownload()
{
// Check the database if should abort the download.
}
function progressCallback($ch, $download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
static $lastCheckTime = 0;
if ((time() - $lastCheckTime) > 4)
if (shouldAbortDownload()) {
return 1;
}
$lastCheckTime = time();
}
}
答案 1 :(得分:0)
这个First答案很完美。但是它仅适用于原始回调函数。 如果您将arg插入回调函数,则无法正常工作,例如:
M
并处理回调
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,function ($resource, $download_size, $downloaded_size, $upload_size, $uploaded_size) use ($my_arg)
{
progressCallback($resource, $download_size, $downloaded_size, $upload_size, $uploaded_size, $my_arg);
}
);