使用CURL的PHP​​:有没有办法模拟cookie而不是将其保存到文件中?

时间:2009-12-07 02:00:10

标签: php rest curl

我访问一个使用名为session_id的变量的REST api服务。 API要求将其存储在cookie中,我按如下方式完成此操作:

$ch = curl_init();    // initialize curl handle

        curl_setopt($ch, CURLOPT_URL, $url); //set target URL
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);// allow redirects
        curl_setopt($ch, CURLOPT_COOKIEFILE, './Cookie.txt');
        curl_setopt($ch, CURLOPT_COOKIEJAR, './Cookie.txt');
        curl_setopt($ch, CURLOPT_POST, TRUE); // set POST method
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, TRUE); //return the headers so we can get session id
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //prevent unverified SSL certificate error
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //prevent unverified SSL ""

        $contents = curl_exec($ch);
        curl_close($ch);

现在的问题是,许多不同的用户会在很多时候调用它。 (必须保存许多不同的cookie文件)我想要一种简单地将session_id存储在变量中而不是引用cookie文件的方法。到目前为止,我的所有尝试都被服务拒绝了。任何人都可以建议存储会话ID和cookie信息的方法,而不保存到文件?请注意,读取会话ID没有问题,它以XML格式返回。由于某种原因,在不引用实际生成的文件的情况下将其传回但未通过安全凭证。关于为什么会这样做的任何更多信息也会有所帮助。

3 个答案:

答案 0 :(得分:21)

Cookie是与请求一起发送的简单文本标头。 CURL允许您直接使用CURLOPT_COOKIE指定它们。

curl_setopt($ch, CURLOPT_COOKIE, 'key=value;anotherkey=anothervalue');

如果你知道要发送什么信息,你可以用这种方式构建自己的cookie头。 COOKIEJAR / COOKIEFILE选项只是自动解析,保存和发送。如果您不想写入文件,则必须手动执行此操作(读取收到的Cookie标头,创建要发送的Cookie标头)。

答案 1 :(得分:8)

这里有一个很好的例子,

http://sgjoomla.googlecode.com/svn/trunk/joomla/curltest.php

出于某种原因,cookie部分已被注释掉,但您需要的所有代码仍然存在。

基本上,你自己解析“Set-Cookie”标题并通过这样做保存cookie值,

  curl_setopt ($ch, CURLOPT_HEADERFUNCTION, 'read_header');

将cookie值放在全局中。在下一个电话中,将其设置为这样,

  curl_setopt($ch, CURLOPT_COOKIE, "$cookieName=$cookieValue");

答案 2 :(得分:4)

我使用tempnam生成唯一的文件名。

$ckfile = tempnam ("/tmp", "cookieMyWeb");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 

在使用curl之前生成新文件名。