内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我试图用PHP取消已经启动的cURL请求。由于我已经找到了一个很好的解决方案,因此我现在遇到了一个unlink函数,因为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);
基本上是用例:用户下载文件,也应该有可能取消下载。我怎么能设法做到这一点?
假设您正在将下载脚本作为守护程序运行,您可以使用CURLOPT_PROGRESSFUNCTION
选项:(否则,您可以通过离开页面或中止xhr来中止请求)
如文档中所述:
返回非零值以中止传输。在这种情况下,传输将设置CURLE_ABORTED_BY_CALLBACK错误。
因此,您可以使用一个回调函数来检查数据库值是否设置为true,如果是,则返回1将中止curl。
然后,当您的用户单击“取消”按钮时,您应该更新数据库并将该值设置为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.
}
static $lastCheckTime = 0;
function progressCallback($ch, $download_size = 0, $downloaded = 0, $upload_size = 0, $uploaded = 0)
{
if ((time() - $lastCheckTime) > 4)
if (shouldAbortDownload()) {
return 1;
}
$lastCheckTime = time();
}
}