【问题标题】:cURL WRITEFUNCTION callback with anonymous function and closures带有匿名函数和闭包的 cURL WRITEFUNCTION 回调
【发布时间】:2011-07-24 02:21:36
【问题描述】:

我正在使用 cURL 的 CURLOPT_WRITEFUNCTION 选项来指定当数据来自 cURL 请求时要处理的回调。

$serverid=5;
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.whatever.com');
curl_setopt(
    $ch, 
    CURLOPT_WRITEFUNCTION, 
    function ($ch, $string) { 
        return readCallback($ch, $string, $serverid);
    }
);
curl_exec($ch);

function readCallback($ch, $string, $serverid) {
    echo "Server #", $serverid, "  |  ", $string;
    return strlen($string);
}

我想使用一个匿名函数来调用我自己的函数,该函数实际上可以工作 (readCallback()),这样我就可以包含与请求关联的服务器 ID ($serverid)。如何正确利用闭包,以便当 cURL 访问我的回调匿名函数时,匿名函数知道它最初是用 $serverid=5 定义的,并且可以适当地调用 readCallback()

我最终会将它与ParalellCurl 和一个通用回调一起使用,这就是为什么需要一个匿名函数使用 ID 调用我的回调的原因。

【问题讨论】:

    标签: php curl closures anonymous-function


    【解决方案1】:

    如果你想在你的匿名函数中访问 $serverid,你必须告诉 PHP 你想使用那个变量。像这样:

    /*
     * I replaced the simple $serverid var to $serverIdHolder because
     * 'use' passes the variable by value, so it won't change inside
     * your anonymous function that way. But if you pass a reference
     * to an object, then you are able to see always the current needed value.
     */
    $serverIdHolder = new stdClass;
    $serverIdHolder->id = 5;
    
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://www.whatever.com');
    curl_setopt(
        $ch, 
        CURLOPT_WRITEFUNCTION, 
        function ($ch, $string) use ($serverIdHolder) { 
            return readCallback($ch, $string, $serverIdHolder->id);
        }
    );
    curl_exec($ch);
    
    function readCallback($ch, $string, $serverid) {
        echo "Server #", $serverid, "  |  ", $string;
        return strlen($string);
    }
    

    【讨论】:

    • 太好了,谢谢!现在,use 是否将该变量“锁定”为定义匿名函数时的值?例如,我最终会计划在一个循环中调用它,$serverid 的值会在每次迭代中改变。如果没有,我该如何创建这样的绑定?
    • 感谢 Imi 的澄清。实际上,我需要的是值,但我可以想到类引用也有用的时候。太好了,再次感谢!
    • 您如何实现相反的效果。我有一个传递给 readCallback 函数的全局变量。在函数内部,全局变量被更新。然后 curl 完成后,您应该能够读取全局变量并看到 readCallback 内部发生的更新。
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2022-01-14
    相关资源
    最近更新 更多