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

r8uurelv  于 2023-01-24  发布在  PHP
关注(0)|答案(5)|浏览(175)

我的cURL脚本在我的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选项?**
  • 主要问题:* * 为什么curl不像它应该做的那样写一个cookie(在我的外部主机上写,而不是在我的本地主机上写。**

其他信息:

    • 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.
pkmbmrz7

pkmbmrz71#

虽然这个问题有点过时了,但我今天也遇到了同样的问题,而且没有用这里的任何建议来解决它。饼干没有保存的原因很简单,就是没有接到

curl_close()

如果curl请求后没有调用curl_close,则不保存cookie。
我花了大约一个小时才知道...也许可以节省你的时间:-)

quhf5bfb

quhf5bfb2#

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

// 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来说,这也一定很容易。

dgiusagp

dgiusagp3#

我可以看出这段代码有两个错误:
您可以在创建资源和执行资源之间切换变量名称:

$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'
));
sg3maiej

sg3maiej4#

我在将脚本从PHP7迁移到PHP8时遇到此问题
在PHP8之前,如果我们不显式调用curl_close($handle),cookie就不会被设置。
在PHP8中,这个函数不再起作用了,我们需要调用unset($handle);来移除CurlHandle对象,这样cookie文件就创建好了。

mzmfm0qo

mzmfm0qo5#

我的情况有两个问题:1)服务器不接受没有值的cookie 2)我没有使用CURLOPT_COOKIEFILE选项
每一个问题都是通过把它分成单独的部分来解决的,每个部分都是单独解决的。
所以我建议你把你的问题分成:1)检查是这个COOKIEFILE问题或网站-直接发送cookie值没有文件-可能是有服务器问题2)如果这将是确定的-检查文件内容可能是有问题(像在我的情况)

相关问题