2011-03-27 36 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