这可能很明显,但
请注意,使用单个实例执行一系列 curl 请求比为每个请求创建新实例要快得多。
(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)
curl_init — 初始化一个 cURL 会话
初始化一个新的会话,并返回一个 cURL 句柄,用于与 curl_setopt()、curl_exec() 和 curl_close() 函数一起使用。
url
如果提供,CURLOPT_URL
选项将设置为其值。您可以使用 curl_setopt() 函数手动设置此选项。
注意:
如果设置了 open_basedir,则 cURL 会禁用
file
协议。
成功时返回一个 cURL 句柄,错误时返回 false
。
版本 | 描述 |
---|---|
8.0.0 | 成功时,此函数现在返回一个 CurlHandle 实例;之前,返回一个 resource。 |
8.0.0 |
url 现在可以为空。 |
示例 #1 初始化一个新的 cURL 会话并获取一个网页
<?php
// 创建一个新的 cURL 资源
$ch = curl_init();
// 设置 URL 和其他适当的选项
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
// 获取 URL 并传递给浏览器
curl_exec($ch);
// 关闭 cURL 资源,并释放系统资源
curl_close($ch);
?>
NextgenThemes 的注释适用于非常有限的情况。为了完整起见,让我们考虑以下代码片段
<?php
/*
您的 localhost 拥有一个默认的 Apache,它只返回“It works!”
*/
$repeatCount = 1000;
// 开始部分
// 这部分很慢
// 调用 localhost,每次创建一个新的句柄
$time = microtime(true);
foreach (range(1, $repeatCount) as $ignored) {
$ch = curl_init("http://localhost");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// 对响应进行一些操作
unset($response);
curl_close($ch);
}
unset($ch);
$elapsed = microtime(true) - $time;
echo "重新创建 curl 句柄,耗时: " . $elapsed . "\n";
// 结束部分
// 开始部分
// 这部分快得多
// 调用 localhost,但重用句柄
$time = microtime(true);
$ch = curl_init("http://localhost");
foreach (range(1, $repeatCount) as $ignored) {
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// 对响应进行一些操作
unset($response);
}
curl_close($ch);
$elapsed = microtime(true) - $time;
echo "重用 curl 句柄,耗时: " . $elapsed . "\n";
// 结束部分
/*
示例输出:
重新创建 curl 句柄,耗时: 11.289301872253
重用 curl 句柄,耗时: 0.53790807723999
*/
?>
以上代码支持 NextgenThemes 的说法,但是“按顺序发送 curl 请求”的方法通常不必要地慢,因为
- 网络传输时间(例如 100ms)
- 远程处理时间(例如 50ms)
- 通常,不需要按特定顺序发送请求
因此,在实践中,当您需要同时发送多个 curl 请求时,只需使用 curl_multi_init 方法。除非您有非常特殊的需要,否则不要考虑“按顺序发送 curl 请求”的方法。