使用PHP取消cURL请求

时间:2018-07-07 13:27:21

标签: php curl

我正在尝试用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);

用例主要是什么:用户下载文件,并且还应该可以取消下载。我该如何做到呢?

2 个答案:

答案 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);   
  }
);