2011-03-27 63 views
3

我使用cURL的CURLOPT_WRITEFUNCTION选项来指定一个回调,以便在数据从cURL请求进入时处理。cURL WRITEFUNCTION带匿名函数和闭包的回调

$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()),这样我可以包括与请求($serverid)相关联的服务器ID。我该如何正确使用闭包,以便当cURL达到我的回叫匿名函数时,匿名函数知道它最初是用$serverid=5定义的,并且可以适当地调用readCallback()

我最终会使用ParalellCur l和一个常见的回调,这就是为什么有必要有一个匿名函数用ID调用我的回调函数。

回答

5

如果您想要在匿名函数中使用$ 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); 
} 
+0

非常好,谢谢!现在,'使用'将该变量锁定到匿名函数定义时的值吗?例如,我最终会计划在一个循环中调用它,'$ serverid'的值会改变每次迭代。如果不是,我该如何创建这样一个绑定? – Brad 2011-03-27 22:37:56

+0

看更新后的答案 – 2011-03-27 22:48:28

+0

感谢Imi的澄清。价值实际上是我所需要的,但我可以想到时间参考也会有用。非常好,再次感谢! – Brad 2011-03-27 22:56:12