单身找媳妇 發表於 2026-5-3 17:26:42

curl_setopt中的CURLOPT_WRITEFUNCTION使用回调和闭包

<p>在PHP中,<code>curl_setopt</code>函数的 <code>CURLOPT_WRITEFUNCTION</code> 是 PHP 中的 cURL 库的一个选项,允许你指定一个回调函数,这个回调函数会处理从服务器接收到的数据。这个回调函数应该有两个参数,第一个是接收到的数据,第二个是写入数据的长度。</p>
<p>使用闭包作为回调函数可以保持闭包外部变量的状态。以下是一个使用闭包和 <code>CURLOPT_WRITEFUNCTION</code> 的示例:</p>
<div class="jb51code"><pre class="brush:php;">$ch = curl_init();
// ... 其他 curl_setopt 调用 ...
// 初始化一个用于存储数据的变量
$buffer = '';
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) use (&amp;$buffer) {
    $length = strlen($data);
    $buffer .= $data; // 将接收到的数据追加到 $buffer 中
    return $length; // 返回接收到的数据长度,这是必须的
});
// 执行请求
curl_exec($ch);
// 关闭 cURL 句柄
curl_close($ch);
// 现在 $buffer 包含了从 cURL 接收到的所有数据
echo $buffer;</pre></div>
<p><strong>注意几点:</strong></p>
<p>&nbsp;回调函数必须返回一个整数,表示它已处理的字节数。在这个例子中,返回$data 字符串的长度。<br />确保在调用 curl_exec 之后检查 $buffer,因为它是在那里填充的。<br />使用 CURLOPT_WRITEFUNCTION 来处理 cURL 请求返回的数据,而不使用外部变量。在回调函数中,你可以直接处理数据,但如果你需要在请求完成后访问这些数据,那么你需要将它们存储在某个地方,比如类属性、全局变量、闭包中的静态变量等。</p>
<p><strong>完整示例</strong></p>
<div class="jb51code"><pre class="brush:php;">class CurlHandler {
    private $dataBuffer = '';
    public function fetchData($url) {
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
      curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) use ($this) {
            $this-&gt;dataBuffer .= $data; // 将数据追加到类属性中
            return strlen($data);
      });
      curl_exec($ch);
      curl_close($ch);
      return $this-&gt;dataBuffer; // 返回完整的数据
    }
}
$handler = new CurlHandler();
$data = $handler-&gt;fetchData('http://example.com');
echo $data; // 输出从 URL 获取的数据</pre></div>
<p>在处理 cURL 请求时,CURLOPT_WRITEFUNCTION 选项确实非常有用,特别是当你想以自定义的方式处理接收到的数据时。使用类属性或闭包中的静态变量是存储这些数据以便稍后使用的常用方法。</p>
<p></p>
頁: [1]
查看完整版本: curl_setopt中的CURLOPT_WRITEFUNCTION使用回调和闭包