php中的curl里面关于CURLOPT配置中的WRITEFUNCTION的解释
CURLOPT_WRITEFUNCTION
CURLOPT_WRITEFUNCTION 是 PHP 中的 cURL 库的一个选项,它用于指定一个回调函数,这个回调函数将会接收 cURL 下载的数据。这个回调函数应该有两个参数,第一个是 data,第二个是 mimetype。
这个选项的值应该是一个有两个参数的函数名,这个函数会在 cURL 接收到数据时被调用。
以下是一些使用 CURLOPT_WRITEFUNCTION 的示例:
function write_data($data) {
$file = fopen('output.txt', 'a');
fwrite($file, $data);
fclose($file);
return strlen($data);
}
$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'write_data');
curl_exec($ch);
curl_close($ch);
在这个例子中,我们创建了一个函数 write_data,这个函数接收数据并将其写入到 output.txt 文件中。然后我们用 curl_setopt 函数将 CURLOPT_WRITEFUNCTION 的值设置为 'write_data'。
$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($handle, $data) {
$file = fopen('output.txt', 'a');
fwrite($file, $data);
fclose($file);
return strlen($data);
});
curl_exec($ch);
curl_close($ch);
在这个例子中,我们使用了一个匿名函数作为 CURLOPT_WRITEFUNCTION 的值。这个函数的功能和上一个例子中的 write_data 函数一样,也是接收数据并写入到 output.txt 文件中。
注意:在这两个例子中,我们都在 curl_exec 函数执行期间将数据写入到 output.txt 文件中。如果你需要在多线程环境中使用这个功能,你可能需要使用其他方法来保证数据的同步写入,因为 curl_multi 可能会在多个线程中调用你的回调函数,这可能会导致数据竞争和数据损坏。
CURLOPT_WRITEDATA
在 PHP 的 cURL 扩展中,CURLOPT_WRITEDATA 是一个选项,它用于指定一个资源(比如文件句柄或者字符串变量)来接收 cURL 下载的数据。当你使用 CURLOPT_WRITEFUNCTION 选项来自定义数据写入的方式时,这个资源通常会作为该函数的第一个参数传递。
如果你没有设置 CURLOPT_WRITEFUNCTION,那么 CURLOPT_WRITEDATA 将默认为 STDOUT,这意味着数据会被直接输出到标准输出。
以下是一些使用 CURLOPT_WRITEDATA 的示例:
示例 1:将数据写入文件
$fileHandle = fopen('output.txt', 'w');
$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_WRITEDATA, $fileHandle);
curl_exec($ch);
fclose($fileHandle);
curl_close($ch);
在这个例子中,我们打开一个文件句柄 $fileHandle,并将其设置为 CURLOPT_WRITEDATA 的值。cURL 将自动把下载的数据写入到这个文件中。
示例 2:将数据写入字符串变量
$responseData = '';
$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 这一行不是必需的,但通常用于确保数据不被直接输出
curl_setopt($ch, CURLOPT_WRITEDATA, fopen('php://temp', 'r+'));
$response = curl_exec($ch);
// 获取临时流中的数据
rewind($responseData);
$responseData = stream_get_contents($responseData);
curl_close($ch);
echo $responseData; // 输出下载的数据
在这个例子中,我们使用 php://temp 来创建一个临时流,并将其设置为 CURLOPT_WRITEDATA 的值。当 cURL 下载完数据后,我们可以从临时流中读取数据到字符串变量 $responseData 中。
请注意,CURLOPT_RETURNTRANSFER 和 CURLOPT_WRITEDATA 通常是互斥的。如果你设置了 CURLOPT_RETURNTRANSFER 为 true,cURL 会将响应内容返回给 curl_exec() 函数,而不是写入到 CURLOPT_WRITEDATA 指定的资源中。在大多数情况下,你只需要使用其中一个选项。如果你使用 CURLOPT_WRITEFUNCTION 自定义了数据写入,CURLOPT_RETURNTRANSFER 将被忽略。
最后,记得在完成后关闭所有的文件句柄和 cURL 句柄,以释放资源。