cURL不再设置cookie,但为什么?

时间:2012-01-22 12:17:35

标签: php cookies curl setcookie

我的 localhost 后,我的cURL脚本不再 (所以请记住它之前的DID工作)(因此它可以在我的外部主机上运行,​​因此:它可能是服务器设置):

此脚本在我的localhost之前工作正常(它仍然在我的主机上)。没有改变。

  • 也许我在本地主机上运行这个脚本超过3000次的事实对我们来说很有用。
  • 我在Windows 7上运行,使用WampServer来设置主机。
  • 我可能更改了一个设置,这会影响Cookie的编写。但是哪一个?

真正的问题:cURL没有设置Cookie!什么apache模块应该用于写入cookie(在.txt文件中)?我正在运行wampserver。

请注意我已经在使用:

    curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt');

那个php.ini是:

extension=php_curl.dll is uncommented
  • 附带问题: curl_close是否取消设置Cookie?如果没有设置cookiejar选项?
  • 主要问题:为什么不像他们应该做的那样弯曲写一个cookie(并且在我的外部主机上,而不是在我的LOCALHOST上。

其他信息:

的phpinfo()

curl
cURL support        enabled
cURL Information    7.21.7
Age                 3
Features
AsynchDNS           Yes
Debug               No
GSS-Negotiate       Yes
IDN                 No
IPv6                Yes
Largefile           Yes
NTLM                Yes
SPNEGO              No
SSL                 Yes
SSPI                Yes
krb4                No
libz                Yes
CharConv            No
Protocols           dict, file, ftp, ftps, gopher, 
                    http, https, imap, imaps, ldap, pop3,
                    pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host                i386-pc-win32
SSL Version         OpenSSL/0.9.8r
ZLib Version        1.2.5
libSSH Version      libssh2/1.2.7 

目前正在使用:

preg_match('/name="csrf" value="(.*?)"/', $getTokenCurlData, $token);

$postFields = array(
    'user'     => $userNum,
    'paswoord' => $userPass,
    'login'    => 'loginform',
    'csrf'     => $token[1]);

// 'user='.$userNum.'&paswoord='.$userPass.'&login=loginform&csrf='.$token[1]

$postData = http_build_query($postFields);

    $curlTable = curl_init();
    curl_setopt($curlTable, CURLOPT_URL, 'link');
    curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_ENCODING, 'gzip');
    curl_setopt($curlTable, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curlTable, CURLOPT_POST, true);
    $tableData = curl_exec($curlTable);
    if (!$tableData) echo 'post problem?'.$tableData;
    if ($tableData == false)
{
    echo 'Curl error: ' . curl_error($curlTable);
}

    curl_close($curlTable);
// Here I further process my data.

4 个答案:

答案 0 :(得分:10)

虽然这个问题有点过时,但我今天遇到了同样的问题,并没有解决这里的任何建议。没有保存cookie的原因只是缺少

的调用
curl_close()

如果curl请求后没有调用curl_close cookie未保存。

花了我一个小时才发现....也许可以节省你的时间: - )

答案 1 :(得分:7)

可能您在登录过程中被禁止了。这将为您提供有关该问题的更多信息:

// change 
// if (!$siteSource) echo 'Help!';
// to
if ($siteSource === false)
{
    echo 'Curl error: ' . curl_error($curl);
}

编辑:您可以尝试其他一些选项(SSL相关解决了我的问题):

curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_VERBOSE, 1);

// following is very important
// TRUE to follow any "Location: " header that the server sends
// as part of the HTTP header (note this is recursive, PHP will follow
// as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set).
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

编辑2:以下选项将为您提供返回的标题(仅用于调试)。除了确保cookie.txt正确使用(可定位和可写)。

curl_setopt($curl, CURLOPT_HEADER, true);

这就是我能为自己做出的贡献。现在吃午饭!


编辑3:Cookie相关内容:

$cookie_file = PATH_TO_YOUR_COOKIE_FILE . '/cookie.txt';

if (! file_exists($cookie_file) || ! is_writable($cookie_file))
{
    echo 'Cookie file missing or not writable.';
    exit;
}

// you already added the following, I put it again just to remark their utility
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file);

编辑4:始终在开头检查:

if ( ! extension_loaded('curl'))
{
    echo "You need to load/activate the curl extension.";
}

如果您收到此错误,请在php.ini中激活curl,取消注释/移除前;

windows:
;extension=php_curl.dll // or curl.dll
linux:
;extension=php_curl.so // or curl.so

并重新启动Web服务器。如果你没有找到这一行,那么你需要安装curl:

// ubuntu
sudo apt-get install php5-curl

// centos
sudo yum install php5-curl

对于Windows或您的wampserver,它也必须很容易。

答案 2 :(得分:1)

我可以看到有两件事与该代码有关:

您可以在创建资源和执行资源之间切换变量名称:

$curl = curl_init();                 // $curl
$siteSource = curl_exec($curlTable); // $curlTable

你发了一个帖子请求,但没有设置内容类型,你应该这样做:

$postFields = array(
  'user' => $userNum,
  'paswoord' => $userPass,
  'login' => 'loginform'
);
// This ensures all strings are properly encoded
$postData = http_build_query($postFields);

// ...

// curl *should* do this by itself, but best to do it explicitly
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
  'Content-Type: application/x-www-form-urlencoded',
  'Content-Length: '.strlen($postData),
  'Connection: close'
));

答案 3 :(得分:-1)

在我看来,有两个问题: 1)服务器没有接受没有值的cookie 2)我没有使用CURLOPT_COOKIEFILE选项

每个问题都可以通过将它分成不同的部分来解决,并自行解决每个问题。

所以我建议你分开你的问题: 1)检查是这个COOKIEFILE问题或网站 - 直接发送cookie值没有文件 - 可能是服务器问题 2)如果这样可以 - 检查文件内容可能有问题(比如在我的情况下)