【问题标题】:stop a curl transfer in the middle在中间停止卷曲转移
【发布时间】:2011-10-16 05:10:51
【问题描述】:

我只能从其中一个回调函数中想到 curl_close()。 但是php会抛出警告:

PHP 警告:curl_close():尝试从回调中关闭 cURL 句柄。

有什么想法吗?

【问题讨论】:

  • 您将需要发布更多代码。
  • 您能否添加更多信息,例如为什么您要在完成之前关闭传输

标签: php curl callback


【解决方案1】:

如果问题是执行 curl 花费的时间太长,您可以设置一个时间,例如

<?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;

【讨论】:

  • 不,先生,我使用比“执行时间太长”更高级的算法,因此当我的算法决定这样做时,我需要杀死它。
【解决方案2】:

你可以从回调函数返回 false 或者不是当前下载数据长度的东西来中止 curl

【讨论】:

  • +1,来自 PHP 手册中 curl_setopt 的更多详细信息: CURLOPT_WRITEFUNCTION 回调函数的名称,其中回调函数有两个参数。第一个是 cURL 资源,第二个是包含要写入的数据的字符串。必须使用此回调函数保存数据。它必须返回写入的确切字节数,否则传输将因错误而中止。
【解决方案3】:

我遇到了类似的问题,需要我能够在中间停止卷曲转移。这很容易在我个人的前十名“似乎有效的肮脏黑客”中名列前茅。

创建一个知道何时取消上传的 curl 读取函数。

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

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

如果数据读取率在一段时间内下降得太低,则告诉 Curl 停止。

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

这将导致 curl 传输在上传期间中止。显然不理想,但它似乎有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多