使用 Cookies
cURL 可以将响应中收到的 cookie 保留在后续请求中。对于内存中的简单会话 cookie 处理,只需一行代码即可实现:
curl_setopt($ch, CURLOPT_COOKIEFILE, "");
如果在销毁 cURL 句柄后需要保留 cookie,你可以指定存储它们的文件:
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
然后,当你想再次使用它们时,将它们作为 cookie 文件传递:
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
但请记住,除非你需要在不同的 cURL 手柄之间携带 cookie,否则这两个步骤是不必要的。对于大多数用例,只需将 CURLOPT_COOKIEFILE
设置为空字符串即可。
例如,Cookie 处理可用于从需要登录的网站检索资源。这通常是两步程序。首先,POST 到登录页面。
<?php
# create a cURL handle
$ch = curl_init();
# set the URL (this could also be passed to curl_init() if desired)
curl_setopt($ch, CURLOPT_URL, "https://www.example.com/login.php");
# set the HTTP method to POST
curl_setopt($ch, CURLOPT_POST, true);
# setting this option to an empty string enables cookie handling
# but does not load cookies from a file
curl_setopt($ch, CURLOPT_COOKIEFILE, "");
# set the values to be sent
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
"username"=>"joe_bloggs",
"password"=>"$up3r_$3cr3t",
));
# return the response body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
# send the request
$result = curl_exec($ch);
第二步(标准错误检查完成后)通常是一个简单的 GET 请求。重要的是为第二个请求重用现有的 cURL 句柄。这可确保第一个响应中的 cookie 将自动包含在第二个请求中。
# we are not calling curl_init()
# simply change the URL
curl_setopt($ch, CURLOPT_URL, "https://www.example.com/show_me_the_foo.php");
# change the method back to GET
curl_setopt($ch, CURLOPT_HTTPGET, true);
# send the request
$result = curl_exec($ch);
# finished with cURL
curl_close($ch);
# do stuff with $result...
这仅用作 cookie 处理的示例。在现实生活中,事情往往更复杂。通常,你必须执行登录页面的初始 GET 以提取需要包含在 POST 中的登录令牌。其他站点可能会根据其用户代理字符串阻止 cURL 客户端,要求你更改它。