如何在php中维护cURL中的会话?

如何在php中维护cURL中的会话?,php,curl,Php,Curl,我们如何在cURL中维护会话 我有一个代码发送一个网站的登录详细信息,并成功登录 我需要在站点上维护会话才能继续 下面是我使用cURL登录站点的代码 <?php $socket = curl_init(); curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com"); curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.

我们如何在cURL中维护会话

我有一个代码发送一个网站的登录详细信息,并成功登录 我需要在站点上维护会话才能继续

下面是我使用cURL登录站点的代码

  <?php  
        $socket = curl_init();
        curl_setopt($socket, CURLOPT_URL, "http://www.XXXXXXX.com");
    curl_setopt($socket, CURLOPT_REFERER, "http://www.XXXXXXX.com");
    curl_setopt($socket, CURLOPT_POST, true);
    curl_setopt($socket, CURLOPT_USERAGENT, $agent);
    curl_setopt($socket, CURLOPT_POSTFIELDS, "form_logusername=XXXXX&form_logpassword=XXXXX");
    curl_setopt($socket, CURLOPT_COOKIESESSION, true);
    curl_setopt($socket, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_setopt($socket, CURLOPT_COOKIEFILE, "cookies.txt");
    $data = curl_exec($socket);
    curl_close($socket); 
   ?>


由于您引用的是cookies.txt文件,而没有任何文件夹引用,我的第一个猜测是您试图写入的文件夹中的文件不可写入。因此,首先检查您是否确实找到了cookies.txt文件,以及它是否包含您期望的会话cookie。

我可能会将该代码移动到函数中。成功登录后,您现在拥有与cookie.txt文件中的cookie关联的会话。在以后的请求中,只要继续使用该cookie文件,您就应该在该站点上有一个有效的会话。

以下是我找到的最好的方法:

下面的文本是以下内容的“混合”版本:

session\u write\u close()做什么?它将结束当前会话并存储会话数据。显然,PHP不喜欢使用多个脚本处理会话,因此,它会锁定会话。将会话_write _关闭可确保存储当前会话,以便检索并使用它

如果不使用
session\u write\u close()

另外,PHPSESSID应替换为会话变量的名称。根据我们的观点,它应该是更一般的东西,比如anId


有时您需要随帖子发送一个用户代理,因此我包含了
CURLOPT\u USERAGENT
参数。

这就是如何使用会话进行CURL

//initial request with login data

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp');  //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

//another request preserving the session

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

我已经在ImpressPages上看到了这一点

感谢您的快速重播文件夹包含cookies.txt文件,并且它是可写的,有权限777它是空的吗?Curl将会话cookie视为非过期。如果没有,请先尝试截断它。此外,您还应该设置CURLOPT_FOLLOWLOCATION,以确保完成登录。我在过去2个小时左右一直在寻找这一点。我正在构建一个API,在那里我正在请求一个不同的API,虽然它似乎可以工作,但是curl连接在执行任何操作之前就超时了。唯一缺少的是
session_write_close()谢谢!这是一个实际工作的独立代码段。对我来说,这是最好的答案。请注意,这永远不会调用
curl\u close($ch)
//initial request with login data

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp');  //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

//another request preserving the session

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}