使用 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 客户端,要求你更改它。